接收端对收到的len 2字节执行do_crc,如果没有差错发生则结果应为0。循环冗余校验

在一些传输协议中,发送端并不指出消息长度,而是采用结束标志,考虑以下几种差错:

1)在消息之前,增加1个或多个0字节;

2)消息以1个或多个连续的0字节开始,丢掉1个或多个0;

3)在消息(包括校验码)之后,增加1个或多个0字节;

4)消息(包括校验码)以1个或多个连续的0字节结尾,丢掉1个或多个0;

显然,这几种差错都检测不出来,其原因就是如果寄存器为0,处理0消息字节(或位),寄存器不变。为了解决前2个问题,只需寄存器的初非0即可,对do_crc作以下改进:

unsigned short do_crc(unsigned short reg_init, unsigned char *message, unsigned int len)

{

unsigned short crc_reg = reg_init;

while (len--)

crc_reg = (crc_reg >> 8) ^ crc16_ccitt_table[(crc_reg ^ *message) & 0xff];

return crc_reg;

}

在CRC16-CCITT标准中reg_init = 0xffff,为了解决后2个问题,在CRC16-CCITT标准中将计算出的校验码与0xffff进行异或,即:

unsigned short code = do_crc(0xffff, message, len);

code ^= 0xffff;

message[len] = code & 0x00ff;

message[len 1] = (code >> 8) & 0x00ff;

显然,现在接收端对收到的所有字节执行do_crc,如果没有差错发生则结果应为某一常GOOD_CRC。其满足以下关系:

unsigned char p[]= {0xff, 0xff};

GOOD_CRC = do_crc(0, p, 2);

其结果为GOOD_CRC = 0xf0b8。

在同一程序中验证如下(放在main函数中可试验):

unsigned char p[]= {0xa0,0xb0,0xff, 0xff};

unsigned short crc;

crc= do_crc(0xffff, p, 2); //计算前两位的CRC码

crc^=0xffff; //对其取反

p[2]=crc&0x00ff; //将计算的CRC码加到信息序列后面

p[3]=crc>>8&0x00ff;

printf("p[2]=%x,p3=%x\n",p[2],p[3]);

crc=do_crc(0xffff,p,4); //对信息码+CRC码共同计算得出CRC=0xf0b8

printf("crc is %x\n",crc);

假设发送的信息是p[0],p[1];低位先发,对其计算的CRC加到信息码后面

然后对信息码+CRC码共同计算CRC,此时应该是常数0xf0b8。不管信息码如何变化,内容和长度都可变,只要把计算的CRC码加进去一起计算CRC,就应该是得该常数GOOD_CRC。

参考文献

--------

[1] Ross N. Williams,"A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS",Version 3,

,August 1993

[2] Simpson, W., Editor, "PPP in HDLC Framing",RFC 1549, December 1993

[3] P. E. Boudreau,W. C. Bergman and D. R. lrvin,"Performance of a cyclic redundancy check and its interaction with a data scrambler",IBM J. RES. DEVELOP.,VOL.38 NO.6,November 1994

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/tongxinshuyu/article-38614-6.html

java实现冗余校验_循环冗余校验_循环冗余校验码计算_循环冗余校验 java实现(6)...相关推荐

  1. java实现冗余校验_Java中循环冗余校验(CRC32)的实现

    前言 本文主要给大家介绍了关于Java实现循环冗余校验(CRC32)的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. CRC32简介 CRC校验实用程序库 在数据存储和数据 ...

  2. java中注解动态传参_Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)...

    Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)java 前言:因为前段时间忙于写接口,在接口中须要作不少的参数校验,本着简洁.高效的原则,便写了这个小工具供本身使 ...

  3. java实现冗余校验_循环冗余校验_循环冗余校验码计算_循环冗余校验 java实现

    CRC的全称为Cyclic Redundancy Check,中文名称为 差错控制理论是在代数理论基础上建立起来的.这里我们着于介绍CRC的算法与实现,对原理只能捎带说明一下.若需要进一步了解线性码. ...

  4. java生成冗余校验码_对循环冗余校验码CRC的理解

    模2加法 1+1=0, 0+1=1, 1+0=1, 0+0=0 模2减法 1-1=0, 0-1=1, 1-0=1, 0-0=0 相当于二进制中的逻辑异或运算.也就是比较后两者对应位相同则结果为&quo ...

  5. 九龙擒庄指标源码破译_九龙擒庄指标源码破译_破译股市密码

    K线密码非原创(主图源码贴图) 您正在下载的是:破译K线密码非原创(主图源码贴图)破译K线密码其实就是趋势射线指标.本人认为是对趋势射线指标的用法作了很好的解释.3),L,3),L,0),7),H,7 ...

  6. java验证xml格式是否正确的是_spring源码附录(1)java实现对XML格式的验证

    最近在看spring源码,涉及到xml文档的解析.xml文档的格式验证,发现自己对xml解析的基础较为薄弱,本篇博客复习下DOM方式解析xml(即spring解析xml的方式). DOM解析XML是将 ...

  7. 【Java游戏开发合集】毕业设计(附源码+资料+课件)

    为正在准备毕业设计的小伙伴们以及想自学一些Java练手项目,小编终于整理出了本套视频课程(附源码+资料+课件),快来白嫖吧!!! 视频教程链接: 全站最全Java游戏合集!毕业设计!(附源码课件)8款 ...

  8. 【源码及课件分享】Java实战项目之进销存管理系统_Java项目开发_Java项目实战

    还没有搞定毕设的小伙伴一定要看鸭~ Java实战项目--进销存管理系统![源码及课件分享]Java实战项目之进销存管理系统_Java项目开发_Java项目实战_Java毕业设计https://www. ...

  9. java 奇偶校验_校验码(海明校验,CRC冗余校验,奇偶校验)

    循环冗余校验码 CRC码利用生成多项式为k个数据位产生r个校验位进行编码,其编码长度为n=k+r所以又称 (n,k)码. CRC码广泛应用于数据通信领域和磁介质存储系统中. CRC理论非常复杂,一般书 ...

最新文章

  1. 存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储
  2. 录制短视频的录制按钮边框计时效果
  3. Python面向对象基础:设置对象属性
  4. iOS之NSString类中compare方法的陷阱
  5. openssh相关文件传输功能
  6. boost::mpl模块BOOST_MPL_ASSERT_MSG相关的测试程序
  7. 5.20打卡 equals()方法与“==”的区别
  8. 如何处理使用ngrx时遇到的错误消息: NullInjectorError R3InjectorError(AppModule)[StoreFeatureModule]
  9. 贷款审批时,会重点看征信报告哪些内容?
  10. 牛客网【每日一题】5月27日题目精讲 货币系统
  11. CentOS安全设置
  12. nagios-3种报警方式–声音–email/邮件—短信
  13. jxl和POI的区别
  14. 关于 “Makefile:3:***遗漏分隔符。停止 。”解决方法二
  15. STL 源代码分析 算法 stl_algo.h -- includes
  16. 解决NSTextContainer分页时文本截断问题
  17. 【虚拟机】关于 virtualbox 和 vmware workstation 对比的个人见解
  18. Android 获取图片研究
  19. unity3d 破解
  20. 交换机的主要功能和工作特性

热门文章

  1. QT创建相应文件夹在指定目录下
  2. Intel Hyperscan简介
  3. Linux开机启动过程(16):start_kernel()->rest_init()启动成功
  4. Linux文件系统:Linux 内核文件描述符表的演变
  5. IQ数据简介:I/Q Data
  6. 解决“Cmake error :generator: Ninja“问题
  7. struct seq_file
  8. linux mtk unique id,1.2.16.1. Nand Flash的Unique ID
  9. 企业会计准则2020版pdf_2020年下半年CATTI三级笔译中译英真题+参考答案+原文件汉英对照PDF版...
  10. Python程序异常处理:try、except、else、finally,捕获指定异常类型、捕获多个异常类型、捕获所有异常类型、捕获异常信息、异常的传递、raise抛出自定义异常