python crc-16 crc-16校验码 crc-16校验算法 ppp(MAC)帧检验序列FCS
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相关推荐
- android MD5校验码的生成与算法实现
android MD5校验码的生成与算法实现 在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD ...
- 如何查看文件的md5校验码、sha1校验码和sha256校验码
如何查看文件的md5校验码.sha1校验码和sha256校验码 本文是基于Windows 10系统和ubuntu 14.04系统环境,使用命令查看文件的md5校验码.sha1校验码和sha256校验码 ...
- 进制转换及如何求校验码(海明校验码及循环冗余校验CRC码)
文章目录 前言 一.进制转换 1.1 二进制转换为八进制数和十六进制数 1.2 任意进制数转换为十进制数 1.3 十进制转换为任意进制 二.校验码求取 2.1海明校验码 2.2循环冗余校验CRC码 总 ...
- C语言CRC校验码计算与校验
循环冗余校验(cyclicredundancy check,CRC)对传输序列进行一次规定的除法操作,将除法操作的余数附加在传输信息的后面.在接收端,也对收到的数据做相同的除法.如果接收端除法得到的结 ...
- bcc校验码计算_CRC校验你会吗?计算、校验、C语言实现,三步教你轻松搞定
目录 前言 CRC算法简介 CRC计算 CRC校验 CRC计算的C语言实现 CRC计算工具 总结 前言 最近的工作中,要实现对通信数据的CRC计算,所以花了两天的时间好好研究了一下,周末有时间整理了一 ...
- 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.- ...
- [软考知识点总结③] 【中级软件设计师】计算机组成原理——校验码、海明校验码、奇偶校验码、循环校验码
奇偶校验码(Parity Codes) 奇偶校验码最简单,但只能检测出奇数位出错. 如果发生偶数位错误就无法检测. 但经研究是奇数位发生错误的概率大很多. 而且奇偶校验码无法检测出哪位出错.所以属于无 ...
- 8月5日 网工学习 CRC校验码 HDLC协议
目录 2.9.3循环冗余校验码CRC 第二章数据通信基础总结 第三章 3.1.2 本地回路 3.2.1 流量控制和差错控制 3.2.2 HDLC协议 2.9.3循环冗余校验码CRC 异或运算:相同是0 ...
- 常用校验码(奇偶校验码、海明校验码、CRC校验码)
常用校验码(奇偶校验码.海明校验码.CRC校验码) 一.奇偶校验码 二.海明校验码 三.CRC校验码 计算机系统运行时,各个部之间要进行数据交换.交换的过程中,会有发生误码的可能(即0变成1或1变 ...
- 一文搞定校验码(奇偶校验,海明,CRC 码)
文章目录 效验码 计算码距方法 奇偶校验码 校验原理 奇偶校验 异或法制 总结 海明校验码 海明校验码的分布规律 海明码纠错以及定位 实现原理 海明码完善 总结 循环冗余校验码(CRC) 模2除算法 ...
最新文章
- 新国标电动自行车目录库
- Linux清除cache的几种方式
- 若依集成 WebSocket
- 删除顽固node_modules
- DevExpress 之 GridControl 自定义列
- ogre 1.9SDK阅读笔记
- 怎么在苹果手机计算机上打字,iPhone苹果手机在打字时如何进行换行
- linux 繁体转简体,Linux下在程序中如何进行繁体中文和简体中文的转换
- CPU位数、操作系统位数、编译器位数
- CSS绝对定位absolute详解
- 算法创作|栈的应用——括号匹配问题解决方法
- Spring Boot的Maven插件Spring Boot Maven plugin详解
- kaggle 入门:逻辑回归应用之Kaggle泰坦尼克之灾
- gmap mysql cachet,MySQL的缓存(Query Cache)
- vue开发android tv,vue-tv-focusable中文文档
- 如何写模板类?(模板类的简单例子)
- 释梦代刷网八套模板+源码+教程 全部功能可用
- 安卓模拟器排行_小鸡模拟器安卓版使用教程
- python计算一个矩阵的主对角线_python – 使用numpy获取多维数组的所有对角线(包括次要对角线)...
- 记事本代码Linux编译不了,Windows下记事本编辑的Shell脚本放到Linux下执行出错,格式问题(/bin/bash^M: bad interpreter: 没有那个文件或目录)...
热门文章
- tesseract 安装
- WebRTC 系列(三、点对点通话,H5、Android、iOS)
- PullToRefresh和SwipeRefreshLayout的使用 1
- 匿名信H5系统UI设计图美术作品登记证书
- 基于JavaSwing开发潜艇大战小游戏 课程设计 大作业源码
- 【图文教程】笔记本总是自动关机怎么办?win11自动关机问题解决方案
- 土木工程 “提桶跑路“,零基础转行Python,成功实现月入过万的学习之路
- 金蝶DEP编辑界面审核反审核,序时簿界面审核反审核代码
- 拍照成手机厂商2018大征关键,拍照黑马魅族15如何炼成?
- 上传文件时提示系统找不到文件