【计算机网络】CRC校验码的代码实现
实验目的
应用所学知识,编写代码实现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校验码的代码实现相关推荐
- CRC校验码生成逻辑的实现原理详解——结合C语言和Verilog语言代码分析
文章目录 前言 一.CRC校验码的计算 1.CRC模型 2.CRC计算 步骤1:输入数据与初始值模2加并左移 步骤2:被除数与多项式模2除 二.CRC校验码生成逻辑的C语言实现 1.实现代码 2.代码 ...
- 16位CRC校验码计算,485MODBUS计算
CRC计算方法是: 1. 加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器. 2. 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该C ...
- 详述CRC校验码(附代码)
关注+星标公众号,不错过精彩内容 来源 | 一口Linux CRC校验应用比较广泛,通常在通信领域用的比较多,即便是自定义通信协议,也可以添加CRC校验码,使其通信更加可靠. 今天就来进一步描述CRC ...
- CRC校验码详解+Verilog实现(含代码)
目录 CRC码简介 CRC校验码生成步骤 CRC码生成多项式 CRC校验码Verilog实现 CRC即循环冗余校验,是一种数字通信中的常用信道编码技术.其特征是信息段和校验字段的长度可以任意选定 CR ...
- CRC校验码(附CRC7校验代码)
前言 CRC校验码其实很简单,详细的去网上查,我这里就简单讲讲 CRC校验码简介 crc校验码其实就是对数据进行模二除法的得出来的余数(模二除法上网查) 模二除法的被除数是数据,除数是校验码对应的多项 ...
- 【计算机网络】CRC校验码||循环冗余码详解及计算习题
[计算机网络]CRC校验码||循环冗余码详解及计算习题
- Modbus-RTU通讯协议中CRC校验码的计算步骤及算法代码
在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算. CRC计算方法是: 1. 预置1个16位的寄存器为十六进制FFFF(全1),此寄存器为CRC寄存器 ...
- 如何计算CRC校验码(循环冗余检验码)
1.什么是CRC校验 在数据通信领域,CRC(循环冗余检验码)常用的一种查错校验码,它的信息字段和校验字段的长度可以任意选定.它主要是通过对要传输的数据进行多项式计算,然后将得到的结果附在数据帧 ...
- CRC校验码计算,以常用CRC-8为例
CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定. CRC校验原理:在要发送的帧后面附加一个数,生成一个新帧发送给接收端.它要使所生成的新帧 ...
最新文章
- 数组-二维数组中的查找
- android studio下载插件时出现的read time out问题
- Ubuntu 12.04 如何切换回英文
- PHP|Yii2下通过插件进行图片处理(亲测可用)
- Java—接口(工厂模式代理模式)
- python 词云_python词云-数据产品岗位描述的词云
- java lua传参_Lua将函数参数作为表键传递
- C语言小案例——万年历制作
- 2013-2-19 Android之ActionBar学习(转)
- java_自由块(静态块和非静态块)
- 基于R实现统计中的检验方法---卡方检验
- Kafka从上手到实践 - 实践真知:搭建Kafka相关的UI工具 | 凌云时刻
- android 十六进制string转int,16进制string转成int
- 存储设备在linux名称,Linux下的存储设备的管理
- bfs和dfs:poj2386和leetcode130
- python生成手写文字图片_使用PHP辅助 快速制作一套自己的手写字体实践
- jedis pool的问题
- Windows命令行调用windows 图片和传真查看器等
- 编程乐趣:获取12306的所有车站电报码
- JSon解析之JSonKit