gpt4 book ai didi

c - 如何执行 CHECKSUM 以确保数据完整性(字节顺序)

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:04:07 29 4
gpt4 key购买 nike

前段时间,我需要一个函数来执行校验和,以在通过 Internet 交换数据报时测试数据完整性。那些天我发现了这个功能,只是复制/粘贴并使用了它。

Checksum (void* buf, int bufsize) {
register int sum = 0;
word answer = 0;
register word *w = (word*) buf;
register int nleft = bufsize;

while (nleft > 1) {
sum += *w++;
nleft -= 2;
}

if (nleft == 1) {
*(byte*)(&answer) = *(byte*)w;
sum += answer;
}

sum = (sum>>16) + (sum&0xFFFF);
sum += (sum>>16);
answer = ~sum;
return answer;
}

今天我正在开发另一个需要校验和以确保数据完整性的程序,但是这次我想看看它是如何工作的并且有一个疑问。

该算法对数据缓冲区的所有字进行求和,然后将进位(高位字,如果有)加到和最后取反(一个的补码),因此它是校验和值。

我的具体问题是:

  1. 缓冲区中的单词是小端还是大端?我的直觉告诉我,字字节应该是 BIG ENDIAN(按照惯例),所以校验和对于任何机器都是相同的,但是这个算法只是简单地对值求和(在 x86 平台上 - little endian),如果另一端是大端平台?如果我为小端和直接为大端求和反转的字节值,它仍然有效吗?

  2. 如果缓冲区大小为奇数,则最后一个字节直接添加到总和中,但它是作为一个值添加还是作为一个字的低位字节添加(考虑到后面的字节是 0 - 高位ORDER byte in little endian)?

它适用于支持校验和的简单通信协议(protocol),但必须确保它适用于独立于其架构的任何平台。

最佳答案

Are the words from the buffer expected to be in little or big endian?

如果没有特定的协议(protocol),您就无法知道。协议(protocol)的字节序有时称为“网络字节序”。传统上大多数协议(protocol)都使用大端,但并不能保证这一点。

If the buffer size is odd, the last byte is added directly to the sum, but is it added just as a value OR as the LOW ORDER byte of a word (considering that the following byte is 0 - HIGH ORDER byte in little endian)?

这并不重要,无论哪种方式都不利于错误检测——对于大多数双位错误,它会惨败。我强烈建议改用 CRC:标准 CRC-16 或 CRC-32 之一,具体取决于数据大小。

关于c - 如何执行 CHECKSUM 以确保数据完整性(字节顺序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55115109/

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