Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从CPP到bash的CRC16算法?_Bash_Checksum_Crc_Crc16 - Fatal编程技术网

从CPP到bash的CRC16算法?

从CPP到bash的CRC16算法?,bash,checksum,crc,crc16,Bash,Checksum,Crc,Crc16,我们通过串行线路发送一些数据,我几乎可以通过bash脚本(而不是代码)完成所有事情,除了crc16计算。如果我可以用脚本而不是代码来完成这一切,那么配置就会变得更容易(尤其是在现场) 我对命令没问题,但当我们处理棘手的事情时,我会失去所有的能力 所以我的问题是,有人可以在bash中为我重写这个CRC16吗 这是从维基百科抓取的算法,它是我们代码中的一个: uint16_t Encoder::checksum(std::string thestring) { uint8_t d, e, f

我们通过串行线路发送一些数据,我几乎可以通过bash脚本(而不是代码)完成所有事情,除了crc16计算。如果我可以用脚本而不是代码来完成这一切,那么配置就会变得更容易(尤其是在现场)

我对命令没问题,但当我们处理棘手的事情时,我会失去所有的能力

所以我的问题是,有人可以在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;
}
uint16\u t编码器::校验和(std::字符串)
{
uint8_t d,e,f;
uint16_t c,r,crccalc;
c=0xffff;
for(无符号整数i=0;i8)^(f4);
c=r;
}
c^=0xffff;
crccalc=c;
返回crccalc;
}

我可以很容易地从C++代码中创建一个可执行文件,只需给它STDIN,但我认为在BASH中能做到这一点是非常整洁的。 另一件我不知道的事情是如何确保我的变量大小是正确的。如何确保获得16位整数

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

Bash有:

  • xor(
    $((5^2))
    将是7)
  • 左移(
    $(32)
    将为2)
  • 六进制数字支持(
    $((0xFF))
    将为255)
在pure 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等等。就这样呆呆地干吧!祝你好运。我能够解决这个问题,并在这个帖子中正确回答: