C 计算16位校验和?

C 计算16位校验和?,c,checksum,C,Checksum,使用c语言的程序读取文件,然后我必须对程序执行8位和16位校验和。到目前为止,我只执行了8位校验和 这是我的理解 我读取文件并将信息存储在一个字符数组中,最后接收换行符。例如,计算8位校验和,这就是本质上发生的事情 文件共有3个字母(3个a和一个换行符) 所以数组可以容纳4个字符aaa+(换行符)(97+97+97+10) 据我所知,我在数组中添加所有字节,然后执行%256,这就是我的校验和 97*3=//根据我的理解,从ascii表中提取3个a(小a) 291+10=301//+换行符 301

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

这是我的理解

我读取文件并将信息存储在一个字符数组中,最后接收换行符。例如,计算8位校验和,这就是本质上发生的事情

文件共有3个字母(3个a和一个换行符)

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

据我所知,我在数组中添加所有字节,然后执行%256,这就是我的校验和

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

291+10=301//+换行符

301%256=十六进制抄送//

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


任何帮助都将不胜感激

要计算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];
}
uint8_t数组[MAX];//数据被复制到这里
大小与长度;//这是数据的长度
uint16\u t校验和=0;
大小\u t偶数长度=长度-长度%2;//四舍五入到2的倍数
对于(int i=0;i<偶数长度;i+=2){
uint16_t val=数组[i]+256*数组[i+1];
校验和+=val;
}
if(i

无需使用模,因为无符号整数自动实现模运算。

我不想用问题来回答问题,但为什么?这个数字有什么意义?当检查16位时,它会有什么不同?而且,301是一个不适合单个字节的数字。这引起了我的思考。这是一个简单的校验和算法,还是其他的修改?这在描述中并不清楚。对于简单的校验和,只要使用
sum&0xffff
(无符号短)sum
(其中
无符号短
表示16位无符号整数)或
sum%65536
,如果您愿意的话(但我不推荐最后一个选项;并不是说会有不同的结果,但我认为最好使用
&
或重新键入以获得更好的可读性)。当然,只有当这是一个家庭作业时才使用sum;供认真使用。