【发布时间】:2019-02-20 22:33:10
【问题描述】:
我很难理解来自RFC 1071 的以下校验和算法:
The following "C" code algorithm computes the checksum with an inner
loop that sums 16-bits at a time in a 32-bit accumulator.
in 6
{
/* Compute Internet Checksum for "count" bytes
* beginning at location "addr".
*/
register long sum = 0;
while( count > 1 ) {
/* This is the inner loop */
sum += * (unsigned short) addr++;
count -= 2;
}
/* Add left-over byte, if any */
if( count > 0 )
sum += * (unsigned char *) addr;
/* Fold 32-bit sum to 16 bits */
while (sum>>16)
sum = (sum & 0xffff) + (sum >> 16);
checksum = ~sum;
}
我的目标是获取一个 char 数组并计算其校验和,但我不确定未定义的变量是什么。 addr 和 checksum 的数据类型是什么和/或,如何将 char 数组转换为可用于校验和过程的格式?我知道 count 是存储在 addr 中的字节数。
编辑:到目前为止,我正在考虑将 char 数组转换为整数,然后获取字节数:
int char_int = sscanf(char_array, "%d", &i);
int addr = char_int;
int count = sizeof(char_int);
【问题讨论】:
-
我可以告诉你,你绝对不想想使用
sscanf(char_array, "%d", &i);它将像"1234"这样的写出数字转换为二进制,而此示例代码旨在将N个原始字节序列视为已经是(N / 2)个16位二进制数序列。我还可以告诉您,显示的代码非常陈旧,并且在现代 C 中所做的事情被认为是不正确的,因此您可能不应该将其用作参考。很遗憾,我没有更好的参考资料供您参考。