当前位置: 首页 > news >正文

异或循环冗余

异或

  • 代码
  • CRC8-ITU
    • 例程
    • 比较
  • 计算
  • CRC16
  • 异或
    • 改进
    • 测试
    • 重点

代码

def fun_crc(datas):crc = 0xFF poly = 0x07 for i in range(len(datas)):for j in range(7, -1, -1):if (crc & 0x80) == 0x80: crc = (crc << 1) ^ polyelse:crc = (crc << 1)if (datas[i] & 2**j):#值为1的位再异或crc ^= polyreturn crc & 0xFF

与一般的CRC8有些不一样。

CRC8-ITU

ITU的全称是国际电信联盟(International Telecommunication Union)。它是一个负责信息通信事务的联合国专门机构,成立于1865年,总部位于瑞士日内瓦。

例程

def cal_crc(datas):crc = 0xFF #初始值poly = 0x07 # 多项式x^8 + x^2 + x^1 + 1,即0x107,省略了最高位1而得0x07for i in range(len(datas)):crc = (crc ^ datas[i]) & 0xFFfor j in range(8, 0, -1):if (crc & 0x80) == 0x80: # 判断最高位是否为1,如果是需要异或,否则仅左移crc = (crc << 1) ^ polyelse:crc = (crc << 1)return crc & 0xFF # 计算后需要进行截取

比较

datas = [0xCB]
start = time.time()	 
print(hex(cal_crc(datas))) 
print("一般循环冗余算法",time.time() - start)
start = time.time()	
print(hex(fun_crc(datas))) 
print("循环冗余算法",time.time() - start)
0x8c
一般循环冗余算法 0.013336658477783203
0x8c
循环冗余算法 0.00408172607421875

计算的结果是一样的,用时还少一点。再用小学三年级上学期的除法算式算一下。

计算

计算CRC8计算过程

不同之处会是多项式除法的一个性质吗,或者是模二运算的性质?

CRC16

开始用的查表法,表里也只有256个元素。用上面两种方式计算的时候要移一个字节,或者直接改成计算16位两个字节。

异或

不一样的是不异或,在计算时处理。可以把(datas[i] & 2**j)的判断放到前面吗?免得异或一次再异或回去。

改进

def fun2_crc(datas):crc = 0xFF #初始值poly = 0x07 # 多项式x^8 + x^2 + x^1 + 1,即0x107,省略了最高位1而得0x07for i in range(len(datas)):for j in range(7, -1, -1):if (datas[i] & 2**j):#与1异或要翻转if (crc & 0x80) == 0x80: crc = (crc << 1)else:crc = (crc << 1) ^ polyelse:#0或1与0异或不翻转if (crc & 0x80) == 0x80: crc = (crc << 1) ^ polyelse:crc = (crc << 1)return crc & 0xFF # 计算后需要进行截取

测试

datas = [0xCB]
for i in range(1000):datas.extend(random.sample(range(255),100))
print(len(datas))
start = time.time()	 
print(hex(cal_crc(datas))) # 输出CRC8校验码
print("一般循环冗余算法",time.time() - start)
start = time.time()	
print(hex(fun_crc(datas))) # 输出CRC8校验码
print("循环冗余算法",time.time() - start)
start = time.time()
print(hex(fun2_crc(datas))) # 输出CRC8校验码
print("改进循环冗余算法",time.time() - start)

把数据增加到十万。打印

 100001
0x27
一般循环冗余算法 0.04993319511413574
0x27
循环冗余算法 6.126452922821045
0x27
改进循环冗余算法 5.69709587097168   

重点

0或1与0异或不翻转,与1异或要翻转。

http://www.dtcms.com/a/324327.html

相关文章:

  • Python设计模式 - 装饰模式
  • 新手向:Python实现文件加密解密工具
  • 旅行者1号无线电工作频段
  • 18.3 全量微调:数据预处理之清洗与准备
  • 机器学习——DBSCAN 聚类算法 + 标准化
  • 实现两个开发板的串口通讯(基于STC8实现)
  • 复刻苏宁易购(移动端)
  • 【GPT入门】第44课 检查 LlamaFactory微调Llama3的效果
  • cursor, vscode黄色波浪线警告问题
  • React:useEffect 与副作用
  • 小巧实用的工具——ZoomIt
  • 【C++对象诞生全解析】构造函数:从内存布局到高效初始化的终极指南
  • 152-基于CWT-CNN-BiGRU-Attention-SABO-LSSVM对滚动轴承的故障诊断
  • spring-boot-starter-data-redis 与 org.redisson 区别 联系
  • 【递归、搜索与回溯算法】深度优先搜索
  • Text2SQL 自助式数据报表开发(Chat BI)
  • 《解锁 C++ 起源与核心:命名空间用法 + 版本演进全知道》
  • Spring Boot 注解详解:@RequestMapping 的多种用法
  • Docker 跨主机容器之间的通信macvlan
  • 攻击实验(ARP欺骗、MAC洪范、TCP SYN Flood攻击、DHCP欺骗、DHCP饿死)
  • Spring Boot与WebSocket构建物联网实时通信系统
  • LeetCode 子集
  • Java基础-Map接口
  • 香橙派 RK3588 部署 DeepSeek
  • SQL约束:数据完整性的守护者
  • Linux中rsync数据镜像工具的解析与应用实战
  • 如何在 Ubuntu 24.04 LTS Linux 上安装 MySQL 服务器
  • JavaScript防抖与节流:拯救你的网页卡顿危机!
  • GitHub 趋势日报 (2025年08月09日)
  • 通过Certbot自动申请更新HTTPS网站的SSL证书