二进制校验和(checksum)的计算方法根据应用场景有所不同,以下是主要计算方式及步骤:
一、IP协议校验和计算
数据分段与填充 - 将IP首部(20字节)分为16位字序列,不足部分用0填充。
- 对于UDP和TCP协议,需添加12字节伪首部(含源IP、目的IP、协议类型、长度等信息)。
反码求和
- 将所有16位字按顺序相加,若和超过16位,则进位需加回。
- 例如:`0001 + 0010 = 0011`,若结果为`0000 0002`,则进位1加到下一组。
取反生成校验和
- 将求和结果取反码(0变1,1变0),作为校验和字段值。
示例: IP首部部分数据`45 00 00 30 80 4c 40 00 80 06`按16位分段后求和得`34ACE`,取反后校验和为`B52E`。
二、通用二进制校验和计算
数据分组
- 将数据按2字节(16位)划分,若最后一组不足2字节,则用0填充。
累加与进位处理
- 累加所有16位值到32位变量中,若某步和超过16位,则将进位加回。
- 例如:
```
16-bit1: 0001
16-bit2: 0010
累加后: 0011
进位: 0001
下一组累加时加上进位:0011 + 0001 = 0100
```
最终取反
- 将32位累加和取反,得到16位校验和。
示例: 数据`45 00 00 3c 00 00 00 00 40 11 6d 36`按16位分段后累加得`192C8`,取反后校验和为`C0A8`。
三、注意事项
数据类型转换:需确保按16位或32位无符号整数处理,避免符号位影响。
工具辅助:部分场景可使用校验和生成工具验证结果。
以上方法适用于网络协议中的数据完整性校验,其他场景(如文件校验)可能采用不同算法(如CRC32)。