实验目的

应用所学知识,编写代码实现CRC计算和验证功能,并验证CRC编码检验的成功率。

实验步骤

①我们先进行CRC校验码的设计部分,我使用的是Python程序设计语言。

CRC校验的核心原理就是模2取余,所以首先设计出异或函数XOR:

#part1:设计CRC校验算法
#异或运算函数
#传入参数为被除数m,除数g
#输出为余数f
def XOR(m, g):if m[0] == '0':return m[1:]#被除数太小,返回补0else:f = ''for i in range(len(m)):if (m[i] == '0' and g[i] == '0') or (m[i] == '1' and g[i] == '1'):f += '0'else:f += '1'return f[1:]        

异或的原理和二进制异或一样,位运算相同即为0,不同即为1。

随后我们就可以以此为基础编写CRC编码函数:

#CRC编码函数
#传入参数分别是数据帧m和除数g
#输出为传输帧=原字符串m+余数f
def CRC_Encode(m,g):m_len=len(m)g_len=len(g)m += '0'*(g_len-1)#补0f = m[0:g_len]for i in range(m_len-1):f = XOR(f, g)f += m[i+g_len]#取m下一位f = XOR(f, g)return m[:m_len]+f

和编码函数几乎类似,校验函数同样把传输帧作为数据帧再次以原除数p计算出余数,判断余数是否为0,如果为0那么CRC校验成功,否则CRC校验失败:

#CRC检验函数
#传入参数分别是传输帧a和除数g
#输出检验结果
def CRC_Decode(a,g):a_len = len(a)g_len = len(g)a += '0'*(g_len-1)#补0f = a[0:g_len]for i in range(a_len-1):f = XOR(f,g)f += a[i+g_len]f = XOR(f,g)return f == '0'*len(f)

②运行函数即可得到测试数据的CRC编码:

#part2:假设发送数据为0x34除数为X4+X+1(10011),计算出CRC校验码
print("计算结果:",CRC_Encode('00110100','10011'))
print("检验结果:",CRC_Decode(CRC_Encode('00110100','10011'),'10011'))

输出得到传输帧为001101000011,并检验成功:

③最后我们设计程序检测CRC的验证率,检测是否存在数据碰撞问题:

#part3:测试CRC验证率
def test():i = 8#数据帧的位数boom=0#计算碰撞次数for m1 in range(2**i):#定义数据m1m1 = (bin(m1)[2:]).zfill(i)      #zfill占位补0                      #定位  for m2 in range(2**(i)):m2 = (bin(m2)[2:]).zfill(i)for p in range(2**(i-3)):      #定义比特模式p p不能大于被除数m  p首位不为0                p = '1' + (bin(p)[2:]).zfill(i-3)f1 = CRC_Encode(m1,p)f2 = CRC_Encode(m2,p)flag1 = CRC_Decode(f1,p)flag2 = CRC_Decode(f2,p)if flag1 and flag2 and m1 != m2 and f1 == f2:boom+=1print('发生冲突!!!\n数据m1:{}\n数据m2:{}\nm1加密数据:{}\nm2加密数据:{}\n除数p:{}\n'.format(m1,m2,f1,f2,p))if boom!=0:print("未检测到{}位CRC冲突\n".format(i))
test()

测试结果

测试发现理论上不存在数据碰撞问题,但是CRC在实践中还是会出现比较低的误码率,在数据传输中还是会出现误码的现象,但是概率较低。

【计算机网络】CRC校验码的代码实现相关推荐

  1. CRC校验码生成逻辑的实现原理详解——结合C语言和Verilog语言代码分析

    文章目录 前言 一.CRC校验码的计算 1.CRC模型 2.CRC计算 步骤1:输入数据与初始值模2加并左移 步骤2:被除数与多项式模2除 二.CRC校验码生成逻辑的C语言实现 1.实现代码 2.代码 ...

  2. 16位CRC校验码计算,485MODBUS计算

    CRC计算方法是: 1. 加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器. 2. 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该C ...

  3. 详述CRC校验码(附代码)

    关注+星标公众号,不错过精彩内容 来源 | 一口Linux CRC校验应用比较广泛,通常在通信领域用的比较多,即便是自定义通信协议,也可以添加CRC校验码,使其通信更加可靠. 今天就来进一步描述CRC ...

  4. CRC校验码详解+Verilog实现(含代码)

    目录 CRC码简介 CRC校验码生成步骤 CRC码生成多项式 CRC校验码Verilog实现 CRC即循环冗余校验,是一种数字通信中的常用信道编码技术.其特征是信息段和校验字段的长度可以任意选定 CR ...

  5. CRC校验码(附CRC7校验代码)

    前言 CRC校验码其实很简单,详细的去网上查,我这里就简单讲讲 CRC校验码简介 crc校验码其实就是对数据进行模二除法的得出来的余数(模二除法上网查) 模二除法的被除数是数据,除数是校验码对应的多项 ...

  6. 【计算机网络】CRC校验码||循环冗余码详解及计算习题

    [计算机网络]CRC校验码||循环冗余码详解及计算习题

  7. Modbus-RTU通讯协议中CRC校验码的计算步骤及算法代码

    在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算. CRC计算方法是: 1. 预置1个16位的寄存器为十六进制FFFF(全1),此寄存器为CRC寄存器 ...

  8. 如何计算CRC校验码(循环冗余检验码)

    1.什么是CRC校验    在数据通信领域,CRC(循环冗余检验码)常用的一种查错校验码,它的信息字段和校验字段的长度可以任意选定.它主要是通过对要传输的数据进行多项式计算,然后将得到的结果附在数据帧 ...

  9. CRC校验码计算,以常用CRC-8为例

    CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定. CRC校验原理:在要发送的帧后面附加一个数,生成一个新帧发送给接收端.它要使所生成的新帧 ...

最新文章

  1. 数组-二维数组中的查找
  2. android studio下载插件时出现的read time out问题
  3. Ubuntu 12.04 如何切换回英文
  4. PHP|Yii2下通过插件进行图片处理(亲测可用)
  5. Java—接口(工厂模式代理模式)
  6. python 词云_python词云-数据产品岗位描述的词云
  7. java lua传参_Lua将函数参数作为表键传递
  8. C语言小案例——万年历制作
  9. 2013-2-19 Android之ActionBar学习(转)
  10. java_自由块(静态块和非静态块)
  11. 基于R实现统计中的检验方法---卡方检验
  12. Kafka从上手到实践 - 实践真知:搭建Kafka相关的UI工具 | 凌云时刻
  13. android 十六进制string转int,16进制string转成int
  14. 存储设备在linux名称,Linux下的存储设备的管理
  15. bfs和dfs:poj2386和leetcode130
  16. python生成手写文字图片_使用PHP辅助 快速制作一套自己的手写字体实践
  17. jedis pool的问题
  18. Windows命令行调用windows 图片和传真查看器等
  19. 编程乐趣:获取12306的所有车站电报码
  20. JSon解析之JSonKit

热门文章

  1. qt的重要文件简介pro、moc、pri、prf
  2. MegaCli 工具安装使用
  3. EN 521便携式蒸气压液化石油气燃气具燃气相关检测标准介绍
  4. CMS和G1垃圾收集器
  5. Ubuntu Linux更新的几种命令
  6. 题目:1103.分糖果 II
  7. golang高性能日志库zap的使用
  8. 联通网络远程服务器无响应,挂机宝服务器卡慢/死机/远程不上/等原因分析!
  9. 【FreeRTOS(二)】任务优先级
  10. 使用vue自定义分页器