【问题标题】:CRC16 algorithm from CPP to bash?从 CPP 到 bash 的 CRC16 算法?
【发布时间】:2011-12-14 22:02:19
【问题描述】:

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

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

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

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

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 位整数?

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

【问题讨论】:

    标签: bash checksum crc crc16


    【解决方案1】:

    Bash 有:

    • 异或($((5^2)) 将是 7);
    • 左移($(3&lt;&lt;2) 将是 12);
    • 右移($(8&gt;&gt;2) 将是 2);
    • 支持十六进制数字($((0xFF)) 将是 255)。

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

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

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

    【讨论】:

    • 嘿,谢谢。我知道 bash 有很多这样的运算符,但我不确定是否保持变量的大小。从来没有想过会为此使用 awk。
    • 我将继续创建一个使用 C++ 代码的小程序,并从标准输入中读取字符串,然后给出 crc。然后,我将尝试 bash 部分。这样,我就会知道我是否做得对(基于 bash 函数的输出是否与 C++ 代码匹配)
    • 如果您要使用 awk,gawk(通常是您使用 linux 获得的)具有左右移位、xor 等。作为命名运算符(它们看起来像功能)见gnu.org/s/gawk/manual/…。只是在傻瓜中做这一切!祝你好运。
    • 我能够解决这个问题,并在此线程中正确回答:stackoverflow.com/questions/8564267/…
    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多