使用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个字符?
任何帮助将不胜感激
答案 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];
}
由于无符号整数会自动实现模块化算术,因此无需使用模数。