我有关于创建这样描述的消息校验和的说明:
校验和由一个字节组成,该字节等于从“消息类型”字开始到消息块末尾的所有字节的二进制补码和(不包括传输的校验和)。最高有效位的进位被忽略。
我发现的另一个描述是:校验和值包含数据消息中其他字(即消息类型、消息长度和数据字)的模 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 规范编写者在他们的数据示例中犯了一个错误。刚发现这个然后回到这里发现其他人也发现了。对不起,如果我浪费了你的时间。我将研究回复,因为它看起来像是一些有助于改进我的代码的有用评论。