这里不再赘述循环冗余校验码的编码方式,直接进入编程。为了便于使用,博主在其中添加了根据tkinter模块编写的GUI界面辅助。全部代码在文末

目录

一、根据生成多项式得到生成编码

二、延长初始序列

三、同位序列异或运算

四、循环补项取余

五、书上例题与样图

六、全部代码

七、结语


一、根据生成多项式得到生成编码

我们以x^4+x^1+1为例:

int(s[2])+1获取生成码的最终位数(4+1=5)

p=s[2::4]获取每一个x的幂数(41)

我们先用digit-1隔绝最后一位,这里使用s.find(x)查找digit-i-1是否在p内,举个简单的例子,上述的多项式最终编码是五位,其中第一位,第四位要变成1,其他位都是0,读者可以思考一下为什么这样可以实现该操作

对于最后一位,有三种可能:x^2+1、x^2+x^1、x^1+1。为了判断是哪一种,我们截取最后的片段来与x^1比较,再决定是否在最后加1

# 根据生成多项式获取生成码
def get_generate_code(s):digit = int(s[2]) + 1i = 0GC = ""p = s[2::4]while i < digit - 1:if p.find(str(digit - i - 1)) == -1:GC += "0"else:GC += "1"i += 1if s[-1:-3] == "x^1":GC += "0"else:GC += "1"return GC

二、延长初始序列

这个很简单,上面计算的生成码有n位,就在原比特序列后面加n-1个0

# 延长初始序列
def length(m, n):p = mi = 1while i <= len(n) - 1:p += "0"i += 1return p

三、同位序列异或运算

我们都知道,要想得到CRC码需要找到余数,而这里我把单独一次的除法运算与循环用函数分割开来

check是监测因子。在计算是,不可能余数由0开头,因此我们设置只用当遇见非0check才会变1,而初始值是0。只有当check不为0时才会向余数序列添加0,有点妙~

# 计算P异或Q并返回余数
def compare(p, q):m = ""check = 0for i in range(0, len(q), 1):if p[i] == q[i]:if check != 0:m += "0"else:m += "1"check = 1return m

四、循环补项取余

我们知道,每次取余后余数的位数很可能小于生成码位数,这是就需要从原序列中补项。我们使用index控制取余补项的进行与停止。

m_front是用于获取第一次进行取余的序列

在最后,index=len(m)退出补项取余行为,但是如果余数与生成码的位数相同,任需要进行最后一次取余行为

def get_CRC(m, n):index = len(n)m_front = m[0: index]remainder = compare(m_front, n)while True:if index < len(m):while len(remainder) < len(n):if index == len(m):breakremainder += m[index]index += 1if len(remainder) == len(n):remainder = compare(remainder, n)else:return remainder

五、书上例题与样图

六、全部代码

from tkinter import *# 根据生成多项式获取生成码
def get_generate_code(s):digit = int(s[2]) + 1i = 0GC = ""p = s[2::4]while i < digit - 1:if p.find(str(digit - i - 1)) == -1:GC += "0"else:GC += "1"i += 1if s[-1:-3] == "x^1":GC += "0"else:GC += "1"return GC# 延长初始序列
def length(m, n):p = mi = 1while i <= len(n) - 1:p += "0"i += 1return p# 计算P异或Q并返回余数
def compare(p, q):m = ""check = 0for i in range(0, len(q), 1):if p[i] == q[i]:if check != 0:m += "0"else:m += "1"check = 1return m# 计算生成校验序列
def get_CRC(m, n):index = len(n)m_front = m[0: index]remainder = compare(m_front, n)while True:if index < len(m):while len(remainder) < len(n):if index == len(m):breakremainder += m[index]index += 1if len(remainder) == len(n):remainder = compare(remainder, n)else:return remainderroot = Tk()
root.title("循环冗余校验码的编译")
screenWidth = root.winfo_screenwidth()
screenHeight = root.winfo_screenheight()
w = 400
h = 150
x = (screenWidth - w) / 2
y = (screenHeight - h) / 2
root.geometry("%dx%d+%d+%d" % (w, h, x, y))label1 = Label(root, text="请输入比特序列:", font="Helvetic 17")
entry1 = Entry(root)
label1.grid(row=0, column=0)
entry1.grid(row=0, column=1, sticky=W+E)label2 = Label(root, text="请输入生成多项式:", font="Helvetic 17")
entry2 = Entry(root)
entry2.insert(0, "例:x^4+x^1+1")
label2.grid(row=1, column=0)
entry2.grid(row=1, column=1, sticky=W+E)def c():bit_sequence = entry1.get()generating_polynomial = entry2.get()generate_code = get_generate_code(generating_polynomial)bit_sequence_final = length(bit_sequence, generate_code)crc_code = get_CRC(bit_sequence_final, generate_code)label3.config(text=bit_sequence + crc_code)label3 = Label(root, text="                                     ", bg="white")
button = Button(root, text="生成发送序列", relief="groove", command=c)
label3.grid(row=2, column=1)
button.grid(row=2, column=0)root.mainloop()

七、结语

能用一门课的知识去解决另一门课的问题,这感觉超棒的!!!

如果有同学对博主的程序有疑问也欢迎指正

Python实例: 实现循环冗余校验码的编码相关推荐

  1. 循环冗余校验码CRC原理和实例

    今天同事问了一个CRC(循环冗余校验码)的问题,好奇心之下学习了一下. 首先说它的原理,百度百科上也有,我就简单说一下,它其实就是采用多项式编码的方法,对于要发送的信息码R,发送方和接收方约定好多项式 ...

  2. 循环冗余校验码CRC,求解步骤

    循环冗余校验码CRC,是软考-计算机组成原理 中一种重要的编码. 下面只是简要描述求解CRC码的解题步骤,面向有一定理论基础的朋友. 直接看例题. 例.信息位: 10100110   生成多项式: 解 ...

  3. 计算机组成原理:循环冗余校验码CRC具备“一位纠错”功能的思考与探索

    笔者在阅读华中科技大学谭志虎老师主编的<计算机组成原理(微课版)>教材进行复习时,产生了一个疑问,并针对性地进行了一些思考.欢迎广大复习到这里同样有问题的同学(寒假开学接着考试实在有点汗, ...

  4. 循环冗余校验码例题[转帖]

    循环冗余较验 循环冗余校验码是模2除,也就是说他是异或算法.而假如我们接受到得CRC码在除以循环冗余检验校验码时有余数说明,在传输过程中,出错了! 在串行传送(磁盘.通讯)或者TCP/IP协议中,广泛 ...

  5. CRC循环冗余校验码总结

    一.CRC简介 先在此说明下什么是CRC:循环冗余码校验 英文名称为Cyclical Redundancy Check,简称CRC,它是利用除法及余数的原理来作错误侦测(Error Detecting ...

  6. 计算机系统基础知识——循环冗余校验码(CRC)

    前言:循环冗余校验码(cyclie redundancy check)简称CRC(循环码),是一种能力相当强的检错.纠错码,并且实现编码和检码的电路比较简单,常用于串行传送(二进制位串沿一条信号线逐位 ...

  7. 奇偶校验码 、循环冗余校验码(CRC)、 海明码

    在计算机运行时,为保证二进制数据在传输时准确无误,通常利用校验码来检测并纠错传输的数据.所谓码距就是任意合法编码之间至少有多少个二进制位不同.例如: 码距位1的"8 1 4 2" ...

  8. 软件考试—计算机组成原理—奇偶校验码、海明码、循环冗余校验码

    目录 1,奇偶校验码 2,海明码 3,循环冗余校验码 码距:是指一个编码系统中任意两个合法编码之间至少有多少个二进制位不同. 利用奇偶校验码来查错的编码系统的合法编码之间的最小码距为2. 奇偶校验码: ...

  9. CRC冗余校验码源码代码c语言,循环冗余校验码(CRC)应用总结(包括C++源码)

    最近在实习期间需要用到数据的校验,所选为CRC16,那么就在此总结一番吧. 现在此说明下什么是CRC:循环冗余码校验 英文名称为Cyclical Redundancy Check,简称CRC,它是利用 ...

最新文章

  1. oracle层次查询用处,Oracle描述层次查询(hierarchicalquery)
  2. SpringBoot第九篇: springboot整合Redis
  3. php加图片源码_PHP添加文字水印或图片水印的水印类完整源代码与使用示例
  4. 2021-11-28
  5. ResNet网络详解与keras实现
  6. 吴恩达机器学习笔记十三之推荐系统
  7. 微课|玩转Python轻松过二级:第1章课后习题解答
  8. seam中格式化文本的处理
  9. 交叉熵损失的来源、说明、求导与pytorch实现
  10. 光子能变成正负电子,能不能变成其他正反物质?
  11. 97年世界黑客编程大赛冠军作品(大小仅为16KB),惊艳世界的编程巨作
  12. 移动边缘计算——计算卸载
  13. PHP在线测算带支付运营版,【PHP】最新在线自动发卡平台源码,带多个支付接口及商户平台...
  14. Windows常见基本进程八:wuauclt
  15. IE主页被恶意软件劫持,360卫士无法修改
  16. 计算机找不管理员,Win7系统鼠标右键找不到“管理员获取所有权”选项怎么办...
  17. 产品 软件验收标准参考
  18. 获取SYSTEM Shell:Citrix Workspace软件命名管道校验客户端漏洞分析
  19. Android图片打水印
  20. android 好的开发工具,使Android开发方便快捷的8个好工具

热门文章

  1. 【1110. 删点成林】
  2. a king读后感 love of the_小王子英语读后感(共7篇)
  3. 计算机视觉应用-圆或者圆点检测
  4. 用css画一个卡通形象-小猪佩奇
  5. 用计算机怎么成绩排名,excel表中如何成绩排名,excel表怎么排名
  6. Java多线程案例:模拟12306火车站售票系统
  7. java1.8中jdk API的下载及应用
  8. 精益安灯电子看板实现了实时监测
  9. Java listT 去重复 数据
  10. php 代付测试demo,php – 2checkout测试支付模拟