python 处理网络帧时,CRC算法中整数按位取反运算(~)得到负数的规避方法
2024-09-06 11:34:39
计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”。
正数的原码,反码,补码都是相同的;负数原码转化为反码:符号位不变,数值位按位取反;负数原码转化为补码:符号位不变,数值位按位取反,末尾加一。
但是python不像C语言有无符号类型,python中一个整数x按位取反后,最高位的符号位:正负交换了,即正数变为负数,负数变为正数了。要实现单纯的按位取反,而不带符号,
可以通过与一个全1的数据按位异或实现。比如,你有一个16位的数据a,需要对它做按位取反,那么这样就行了:a ^= 0xffff
比如将如下C++ 算法用python替代:
C++ 代码:
1 UINT8 check_sum(UINT8 *buf, UINT8 bufLen)
2 {
3 UINT8 ucCrc = 0;
4 UINT8 i;
5 for (i=0; i<bufLen; i++)
6 {
7 ucCrc += buf[i];
8 }
9 ucCrc = ~ucCrc;
10 ucCrc += 1;
11 return ucCrc;
12 }
python代码:
1 def check_sum(data):
2 usCRC = 0
3 for byte in data:
4 usCrc += ord(byte)
5 #usCrc = ~usCrc #此处不能跟C++一样使用按位取反运算
6 usCrc ^= 0xff
7 usCrc += 1
8 return '%02X'%usCrc
最新文章
- centos7 安装lamp
- C#正则表达式教程和示例
- 我的opencv之旅:ios人脸识别
- [Effective JavaScript 笔记]第32条:始终不要修改__proto__属性
- @Register指令
- 1_1准备工作[wp8特色开发与编程技巧]
- 3月3日(3) Binary Tree Preorder Traversal
- ASP.NET-FineUI开发实践-11
- jrae源码解析(二)
- HTML标签的命名/CSS标准化命名大全
- react native 1跳2 2跳3 3跳4 4pop回2
- linux学习笔记2 - linux常用命令
- MongoDB一键安装(参数全部定制)
- RESTframework简介
- [codechef July Challenge 2017] Chef and Sign Sequences
- EOS开发经验总结——不定期持续更新中
- CF 1114 E. Arithmetic Progression
- 解决MySQL Slave 触发 oom-killer
- linux的chmod,chown命令详解
- STS项目html文件中文乱码解决