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. 新国标电动自行车目录库
  2. Linux清除cache的几种方式
  3. 若依集成 WebSocket
  4. 删除顽固node_modules
  5. DevExpress 之 GridControl 自定义列
  6. ogre 1.9SDK阅读笔记
  7. 怎么在苹果手机计算机上打字,iPhone苹果手机在打字时如何进行换行
  8. linux 繁体转简体,Linux下在程序中如何进行繁体中文和简体中文的转换
  9. CPU位数、操作系统位数、编译器位数
  10. CSS绝对定位absolute详解
  11. 算法创作|栈的应用——括号匹配问题解决方法
  12. Spring Boot的Maven插件Spring Boot Maven plugin详解
  13. kaggle 入门:逻辑回归应用之Kaggle泰坦尼克之灾
  14. gmap mysql cachet,MySQL的缓存(Query Cache)
  15. vue开发android tv,vue-tv-focusable中文文档
  16. 如何写模板类?(模板类的简单例子)
  17. 释梦代刷网八套模板+源码+教程 全部功能可用
  18. 安卓模拟器排行_小鸡模拟器安卓版使用教程
  19. python计算一个矩阵的主对角线_python – 使用numpy获取多维数组的所有对角线(包括次要对角线)...
  20. 记事本代码Linux编译不了,Windows下记事本编辑的Shell脚本放到Linux下执行出错,格式问题(/bin/bash^M: bad interpreter: 没有那个文件或目录)...

热门文章

  1. tesseract 安装
  2. WebRTC 系列(三、点对点通话,H5、Android、iOS)
  3. PullToRefresh和SwipeRefreshLayout的使用 1
  4. 匿名信H5系统UI设计图美术作品登记证书
  5. 基于JavaSwing开发潜艇大战小游戏 课程设计 大作业源码
  6. 【图文教程】笔记本总是自动关机怎么办?win11自动关机问题解决方案
  7. 土木工程 “提桶跑路“,零基础转行Python,成功实现月入过万的学习之路
  8. 金蝶DEP编辑界面审核反审核,序时簿界面审核反审核代码
  9. 拍照成手机厂商2018大征关键,拍照黑马魅族15如何炼成?
  10. 上传文件时提示系统找不到文件