校验和
来源:互联网 发布: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.最后返回校验和,是一个二进制的反码
- crc校验,和校验
- 校验和
- 校验和
- 校验和
- 校验和
- 校验和
- 校验和
- 校验和
- C#累加校验,校验和
- 校验数量和校验金额
- 手机校验和邮箱校验
- CRC校验和LCRC校验
- 校验点和校验点进程
- Struts2字段校验和非字段校验
- 海明校验 和 CRC校验
- 说说前台校验和后台校验
- 服务器端校验(更重要)和客户端校验
- 校验和的计算/校验算法
- ios uitableview加入uiscrollview广告栏
- SQL应用与开发:(七)数据操作 · 查 · (二)高级型
- 王银银算了算,家里除了4个年轻人和1个小孩外似乎都能称得上老人了
- 动态路由协议
- linux命令——双向重导向:tee
- 校验和
- 构造方法
- 欢迎使用CSDN-markdown编辑器
- CI 区分移动端PC端
- Isomorphic Strings —— Leetcode
- 接口的继承的例子
- 2015年“深圳杯”数学建模夏令营-B题:DNA序列的k-mer index 问题
- ubuntu 14.04 上安装GNS3
- 牛腩问题--WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping