计算16位校验和?

时间:2018-10-25 01:20:01

标签: c checksum

使用c中的程序读取文件,然后我必须对程序进行8位和16位校验和。到目前为止,我只完成了8位校验和。

这是我的理解

我读取了文件并将信息存储在一个字符数组中,最后它接受换行符。因此,例如,要计算8位校验和,本质上就是

文件总共3个字母(3个字母和换行符)

因此数组可容纳4个字符aaa +(换行符)(97 + 97 + 97 + 10)

据我了解,我将数组中的所有字节相加,然后执行%256,这就是我的校验和。

97 * 3 = //根据我的理解,从ascii表中提取了3个(小a)

291 + 10 = 301 // +换行符

301%256 = cc十六进制//

但是我对如何计算16位校验和感到困惑,因为如果单个字符数组不能一次添加2个字符?

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

要计算16位校验和,请以2为增量处理数组,并将一个字节放入要添加的值的低位字节,另一个字节放入高位字节。

uint8_t array[MAX]; // The data gets copied into here
size_t length; // This is the length of the data
uint16_t checksum = 0;
size_t even_length = length - length%2; // Round down to multiple of 2
for (int i = 0; i < even_length; i += 2) {
    uint16_t val = array[i] + 256 * array[i+1];
    checksum += val;
}
if (i < length) { // Last byte if it's odd length
    checksum += array[i];
}

由于无符号整数会自动实现模块化算术,因此无需使用模数。