python crc-16 crc-16校验码 crc-16校验算法 ppp(MAC)帧检验序列FCS

想弄明白这里要看多几遍,配合下面的例子能更快理解。

第一、CRC-16校验码计算方法:
常用查表法和计算法。计算方法一般都是:
(1)、预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;
(2)、把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低
8位相异或,把结果放于CRC寄存器,高八位数据不变;
(3)、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
(4)、如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC寄存器与多
项式A001(1010 0000 0000 0001)进行异或;
(5)、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
(6)、重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
(7)、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低
字节进行交换;
(8)、最后得到的CRC寄存器内容即为:CRC码。
以上计算步骤中的多项式A001是8005按位颠倒后的结果。

8005(1000 0000 0000 0101)二进制旋转180度(按位颠倒)即为A001(1010 0000 0000 0001)
因为这是被除数右移,左移的话不用颠倒为8005。(相对来说就是除数左移颠倒,右移不用颠倒为8005)
除数也就是生成多项式,是有标准的。
为什么要设置crc寄存器初始值为FFFF?因为某些数据在前面加0但结果不变,所以加了点改动,CRC-16具体细分也有不同标准,就是CRC寄存器初始值,结果异或值,高低位在前在后不同等等。

我们这用MODBUS

前8位不动,后8位和传过来的数据的两位16进制数异或成新的crc值。
右移两位,因为移一位移出去的是0,第二位是1,然后异或

只要移出去的是0就继续移,直到是有个1移出去。下面是完整过程

移动8位结束,重新下一轮,结束时的crc值作为新一轮的初始值,下两位16进制数为:00


结果为F807
接下来是Python写的代码,这里是直接求值法,另外一种是查表法。

def calc_crc(string):data = bytearray.fromhex(string)crc = 0xFFFF#初始值for pos in data:crc ^= pos#每次两位16进制和crc低8位异或for i in range(8):#右移八次if ((crc & 1) != 0):#如果移出去的不是0(即移出去的是1)则右移1位且和A001异或。否则为0直接右移1位不作其他处理crc >>= 1crc ^= 0xA001else:crc >>= 1return hex(((crc & 0xff) << 8) + (crc >> 8))[2:]#高低8位对调。crc = calc_crc('3D00030007')
print('crc:'+crc)


bytearray.fromhex(string)不好说,可以看下面两个链接自行体会。简单来说就是把传进来的16进制数string转化为数组,每两位16进制数作为一组数据,有些似乎因为ASCII码超出范围而不能用\x表示,用其ASCII值对应的字符表示,它们实际值是一样的。
crc ^= pos 即 crc= crc ^ pos 异或运算
crc >>= 1 即 crc = crc >>1 右移1位
if ((crc & 1) != 0): & 在Python里(如果是数值的话)是位运算,都是1则为1,其他情况为0。crc & 1其实是crc & 0000 0001。crc末位为1则为1,意为移出去的是1;crc末位为0则为0,意为移出去的是0
最后一行hex(((crc & 0xff) << 8) + (crc >> 8))[2:]
[2:]意为选取结果的第2位到最后,从0开始,不写则结果为0x…
hex()返回16进制数
(crc & 0xff) << 8) 和0000 0000 1111 1111 并运算,高8位结果为0,低八位为原值,再左移8位。
结果由原来的0000 0000 xxxx xxxx变为xxxx xxxx 0000 0000
(crc >> 8) 右移8位,高八位变低八位,高八位可看成自动补0。
结果由原来的xxxx xxxx xxxx xxxx变为0000 0000 xxxx xxxx
相加得高低八位互换的效果。

Python标准库中关于bytearray.fromhex(string)的疑问
bytes的hex和fromhex函数

参考:
怎么计算crc16校验数据的校验码
循环冗余校验CRC算法
Python计算CRC16

python crc-16 crc-16校验码 crc-16校验算法 ppp(MAC)帧检验序列FCS相关推荐

  1. android MD5校验码的生成与算法实现

    android MD5校验码的生成与算法实现 在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD ...

  2. 如何查看文件的md5校验码、sha1校验码和sha256校验码

    如何查看文件的md5校验码.sha1校验码和sha256校验码 本文是基于Windows 10系统和ubuntu 14.04系统环境,使用命令查看文件的md5校验码.sha1校验码和sha256校验码 ...

  3. 进制转换及如何求校验码(海明校验码及循环冗余校验CRC码)

    文章目录 前言 一.进制转换 1.1 二进制转换为八进制数和十六进制数 1.2 任意进制数转换为十进制数 1.3 十进制转换为任意进制 二.校验码求取 2.1海明校验码 2.2循环冗余校验CRC码 总 ...

  4. C语言CRC校验码计算与校验

    循环冗余校验(cyclicredundancy check,CRC)对传输序列进行一次规定的除法操作,将除法操作的余数附加在传输信息的后面.在接收端,也对收到的数据做相同的除法.如果接收端除法得到的结 ...

  5. bcc校验码计算_CRC校验你会吗?计算、校验、C语言实现,三步教你轻松搞定

    目录 前言 CRC算法简介 CRC计算 CRC校验 CRC计算的C语言实现 CRC计算工具 总结 前言 最近的工作中,要实现对通信数据的CRC计算,所以花了两天的时间好好研究了一下,周末有时间整理了一 ...

  6. c语言海明校验码编码,海明校验码的编码规则有哪些?

    在海明码中, 位号数(1.2.3.--.n)为2的权值的那些位,即: 1(2^0).2(2^1).4(2^2).8(2^3).-2^(r-1)位,作为奇偶校验位,并记作: P1.P2.P3 .P4.- ...

  7. [软考知识点总结③] 【中级软件设计师】计算机组成原理——校验码、海明校验码、奇偶校验码、循环校验码

    奇偶校验码(Parity Codes) 奇偶校验码最简单,但只能检测出奇数位出错. 如果发生偶数位错误就无法检测. 但经研究是奇数位发生错误的概率大很多. 而且奇偶校验码无法检测出哪位出错.所以属于无 ...

  8. 8月5日 网工学习 CRC校验码 HDLC协议

    目录 2.9.3循环冗余校验码CRC 第二章数据通信基础总结 第三章 3.1.2 本地回路 3.2.1 流量控制和差错控制 3.2.2 HDLC协议 2.9.3循环冗余校验码CRC 异或运算:相同是0 ...

  9. 常用校验码(奇偶校验码、海明校验码、CRC校验码)

    常用校验码(奇偶校验码.海明校验码.CRC校验码) 一.奇偶校验码 二.海明校验码 三.CRC校验码   计算机系统运行时,各个部之间要进行数据交换.交换的过程中,会有发生误码的可能(即0变成1或1变 ...

  10. 一文搞定校验码(奇偶校验,海明,CRC 码)

    文章目录 效验码 计算码距方法 奇偶校验码 校验原理 奇偶校验 异或法制 总结 海明校验码 海明校验码的分布规律 海明码纠错以及定位 实现原理 海明码完善 总结 循环冗余校验码(CRC) 模2除算法 ...

最新文章

  1. The application could not be installed: INSTALL_FAILED_NO_MATCHING_ABIS
  2. python实现gauss-seidel迭代公式_python实现高斯(Gauss)迭代法的例子
  3. linux qemu 报错 Unable to reserve 0xfffff000 bytes of virtual address space at 0x1000 解决方法
  4. java的Serialization 机制
  5. 数据库的binlog、redolog以及undolog
  6. linux内核杂记(12)-进程调度(7)
  7. 谈华为鸿蒙内核和操作系统,谈华为鸿蒙内核和操作系统
  8. 计算机组成原理输入实验报告,计算机组成原理实验报告
  9. java 动态获取IP地址(城市)
  10. SpringMVC-动力节点-王鹤
  11. Android挂断、接听电话
  12. php顺序查找法,php二分查找、顺序查找算法
  13. 关于vs08生成解决方案慢的解决方法
  14. 《App违法违规收集使用个人信息自评估指南》
  15. SVG中中文字体的显示
  16. mysql的delete语句使用exists删除数据走不通
  17. 【python】自动统计考勤数据
  18. 算法设计与分析:Word Ladder(Week 4)
  19. 如何用python 对PDF进行拆分,批量修改文件名(根据excel表格)
  20. 语c语言描写,1:语c是什么.还有一些常识.(?)

热门文章

  1. vue动态粒子背景效果-particles、threejs
  2. 为什么说JavaScript是一种客户端脚本语言?
  3. telnet命令验证服务器端口,Telnet 命令测试服务器端口是否通讯的办法
  4. 阿里云服务器 安装SVN
  5. C语言实现贪吃蛇游戏(Linux下实现)
  6. 利用Web玩转树莓派
  7. LVS FULLNAT
  8. 跑步蓝牙耳机牌子的好,最适合跑步用的蓝牙耳机
  9. 秋式网站日志分析器 查看蜘蛛抓取情况
  10. 你知道CPU温度过高如何降温吗