从CPP到bash的CRC16算法?
我们通过串行线路发送一些数据,我几乎可以通过bash脚本(而不是代码)完成所有事情,除了crc16计算。如果我可以用脚本而不是代码来完成这一切,那么配置就会变得更容易(尤其是在现场) 我对命令没问题,但当我们处理棘手的事情时,我会失去所有的能力 所以我的问题是,有人可以在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
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(
将是7)李>$((5^2))
- 左移(
将为2)李>$(32)
- 六进制数字支持(
将为255)$((0xFF))
$ echo 65536 | awk '{printf("%hu\n",$1)}'
0
这应该足以在Bash中重写算法。嘿,谢谢。我知道bash有很多这样的操作符,但我不确定如何保持变量的大小。我从来没有想过用AWK来做这个。我将继续创建一个使用C++代码的小程序,从标准中读取字符串,然后给出CRC。然后,我将尝试一下bash部分。这样,我就知道我做的是正确的(基于BASH函数的输出与C++代码匹配),如果你要使用AWK,GAWK(通常是Linux中的)有左右移位,XOR等等。就这样呆呆地干吧!祝你好运。我能够解决这个问题,并在这个帖子中正确回答: