gpt4 book ai didi

c++ - 校验和计算——所有字节的补码和

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:34 24 4
gpt4 key购买 nike

我有关于创建这样描述的消息的校验和的说明:

校验和由一个字节组成,等于从“消息类型”字开始到消息 block 结尾的所有字节的二进制补码和(不包括传输的校验和)。忽略最高有效位的进位。

我找到的另一个描述是:校验和值包含数据消息中其他字(即消息类型、消息长度和数据字)的模 256 和的二进制补码。接收设备可以计算接收到的字的模 256 和,并将该和添加到接收到的校验和字中。结果为零通常表示消息已正确接收。

我理解这意味着我将消息中所有字节的值相加(不包括校验和),得到这个数字的模 256。得到这个数字的补码,这就是我的校验和。

但是我在处理示例消息示例时遇到了问题(来自设计文档,因此我必须假设它已被正确编码)。

unsigned char arr[] = {0x80,0x15,0x1,0x8,0x30,0x33,0x31,0x35,0x31,0x30,0x33,0x30,0x2,0x8,0x30,0x33,0x35,0x31,0x2d,0x33,0x32,0x31,0x30,0xe};

所以最后一个字节 0xE 是校验和。我计算校验和的代码如下:

bool isMsgValid(unsigned char arr[], int len) {
int sum = 0;
for(int i = 0; i < (len-1); ++i) {
sum += arr[i];
}
//modulo 256 sum
sum %= 256;

char ch = sum;

//twos complement
unsigned char twoscompl = ~ch + 1;

return arr[len-1] == twoscompl;
}


int main(int argc, char* argv[])
{
unsigned char arr[] = {0x80,0x15,0x1,0x8,0x30,0x33,0x31,0x35,0x31,0x30,0x33,0x30,0x2,0x8,0x30,0x33,0x35,0x31,0x2d,0x33,0x32,0x31,0x30,0xe};
int arrsize = sizeof(arr) / sizeof(arr[0]);

bool ret = isMsgValid(arr, arrsize);

return 0;
}

规范在这里:= http://www.sinet.bt.com/227v3p5.pdf

我想我误解了所需的算法。知道如何创建此校验和吗?

Flippin 规范作者在他们的数据示例中犯了一个错误。刚发现这个然后回到这里发现其他人也被发现了。对不起,如果我浪费了你的时间。我会研究回复,因为它看起来像是一些对改进我的代码有用的评论。

最佳答案

您从链接的 pdf 中错误复制了示例消息。第二个参数长度是9个字节,但是你在代码中使用了0x08。

当参数中实际上有 9 个字节时,文档在第三列中错误地声明了“8 个字节”。第二列正确显示“00001001”。

换句话说,您的测试消息应该是:

{0x80,0x15,0x1,0x8,0x30,0x33,0x31,0x35,0x31,0x30,0x33,0x30, // param1
0x2,0x9,0x30,0x33,0x35,0x31,0x2d,0x33,0x32,0x31,0x30,0xe} // param2
^^^

使用正确的消息数组,ret == true 当我尝试你的程序时。

关于c++ - 校验和计算——所有字节的补码和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12238528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com