1.将发送的进行检验和运算的数据分成若干个16位的位串,每个位串看成一个 二进制数 ,这里并不管 字符串 代表什么,是整数、浮点数还是位图都无所谓。
2.将 IP 、 UDP 或 TCP 的PDU首部中的检验和字段置为0,该字段也参与检验和运算。
3.对这些16位的二进制数进行1的补码和(one's complement sum)运算,累加的结果再取反码即生成了检验码。将检验码放入检验和字段中。
其中1的补码和运算,即带循环进位(end round carry)的加法,最高位有进位应循环进到最低位。反码即二进制各位取反,如0111的反码为1000。
1.接收方将接收的数据(包括检验和字段)按发送方的同样的方法进行1的 补码 和运算,累加的结果再取反码。
2.校验,如果上步的结果为0,表示传输正确;否则,说明传输有差错。
返回值是追加了校验和的原始字节数组。
DoSumCheck的参数就是原字节数组在尾部加上了校验和,如果数据正确运算结果就为00。
调用演示:
运行结果:
用位运算按位与得出校验数,参考代码如下:#include<stdio.h>
int main()
{
char str[101]
int i,sum
gets(str)
i=sum=0
while(str[i]!=0)
sum+=str[i++]
printf("%d",sum&(0x0FF))
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)