我正在尝试在 bash 中实现 CRC16 校验和。我正在从现有的 C++ 代码中移植。我快到了,但我得到了不同的答案。
我不太明白为什么 C++ 代码和 bash 脚本之间的校验和不同。
另一双眼睛会有很大的帮助。
这是 C++ 代码:
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;
}
这是我的 bash 代码:
function calc_crc16()
{
string=$1
while read -d "" -n 1 ; do astring+=( "$reply" ) ; done <<< "$string"
cnt=${#astring[@]}
c=0xffff
for ((x=0;x<$cnt;x++)); do
char=${astring[$x]}
e=$(($c ^ $char))
s=$(($e << 4))
f=$(($e ^ $s))
t1=$(($c >> 8))
t2=$(($f << 8))
t3=$(($f << 3))
t4=$(($f >> 4))
r1=$(($t1 ^ $t2 ^ $t3 ^ $t4))
c=$r1
done
c=$c ^ 0xffff
echo "checksum = $c"
}
它会与整数的大小有关吗?我猜在 bash 中我对此无能为力。
我得到了一个实际数字,但它与我知道可以正常工作的 C++ 不匹配。有没有人看到我可能把事情搞砸的地方?