0

我们正在通过串行线路发送一些数据,除了 crc16 计算之外,我几乎可以通过 bash 脚本(而不是代码)完成所有操作。如果我可以在脚本与代码中完成所有操作,它将使配置变得更容易(尤其是在现场)。

我对命令没问题,但是当我们遇到棘手的事情时,我失去了所有能力。

所以我的问题是,有人可以为我重写这个 CRC16,但是在 bash 中?

这是从维基百科抓取的算法,它是我们代码中的算法:

uint16_t Encoder::checksum(std::string thestring)
{
    uint8_t d, e, f;
    uint16_t c, r, crccalc;
    c = 0xffff;

    for (unsigned int i = 0; i < thestring.length(); i++)
    {
        d = thestring[i];
        e = c ^ d;
        f = e ^ (e << 4);
        r = (c >> 8) ^ (f << 8) ^ (f << 3) ^ (f >> 4);
        c = r;
    }
    c ^= 0xffff;
    crccalc = c;
    return crccalc;
}

我可以很容易地从 C++ 代码中创建一个可执行文件,然后将其输入标准输入,但我认为能够在 bash 中包含它会非常好。

我不知道的另一件事是如何确保我的可变大小是正确的。我怎样才能确保我得到一个 16 位整数?

任何帮助都会很棒。我在网上找到了一个小脚本,但我不相信它。认为在这里回答真的很酷。

4

1 回答 1

0

巴什有:

  • xor($((5^2))将是 7);
  • 左移($(3<<2)将是 12);
  • 右移($(8>>2)将是 2);
  • 十六进制数字支持($((0xFF))将是 255)。

没有想到在纯 Bash 中将 32 (64) 转换为 16 位整数,但您可以使用 awk 来完成:

$ echo 65536 | awk '{printf("%hu\n",$1)}'
0

这应该足以在 Bash 中重写算法。

于 2011-12-15T00:03:17.850 回答