python 处理网络帧时,CRC算法中整数按位取反运算(~)得到负数的规避方法

时间:2019-08-28
本文章向大家介绍python 处理网络帧时,CRC算法中整数按位取反运算(~)得到负数的规避方法,主要包括python 处理网络帧时,CRC算法中整数按位取反运算(~)得到负数的规避方法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

计算机中的符号数有三种表示方法,即原码反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用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

原文地址:https://www.cnblogs.com/fdzwdt/p/11423235.html