校验和

来源:互联网 发布:github desktop mac 编辑:程序博客网 时间:2024/04/28 02:51

校验和是用于检测传输过程中可能产生的错误,将其置于数据后,随数据一同发送,接收端通过同样的算法进行检查,若正确就接受,错误就丢弃

校验和C源代码:


unsigned short checksum(unsigned char *buf,int len)
{
        unsigned int sum=0;          //1
        unsigned short *cbuf;        //2
        cbuf=(unsigned short *)buf;    //3


        while(len>1)                        //4
        {
                sum+=*cbuf++;
                len-=2;
        }
        if(len)                               //5
        {
                sum+=*(unsigned char *)cbuf;
        }


        while(sum>>16)     //6
        {
                sum=(sum>>16)+(sum&0xffff);
        }
return (~sum);     //7
}


1.定义检验和变量,32位的 int型

2.定义接受的字符,16位的short int 型,因为校验和就是一个基于16位的反码计算原理,计算机制为1的补码,对称的系统,ffff和0000分别为-0和+0,afff和7ffff分别是-32767和+32767,这与我们平时遇到的2的补码机制不同

为什么要基于1的补码并进行反码求和机制?

因为考虑到大端和小端字节序的问题,在不同架构的处理器的保存方式不同,如果用常规的加法,接收端和发送端可能由于处理器架构不同会出现校验和的不同,但用反码求和,不管是大端还是小端,最终得到的结果都一样,不会影响到最终的校验和。

3.将8位的char类型转换成16位的short型 

4.进行校验和的加法,都是基于16位的,每次进行16位移动

5.若len为奇数,要加上最后的8bit,也就是最后一个字节

6.将得到的校验和右移16位,这里是无符号的,也就是算术右移,后面一句也就是将sum的高16位和低16位做加法,这就是1的补码机制,最高位进位加到最低位。

7.最后返回校验和,是一个二进制的反码




0 0
原创粉丝点击