Python中整数移位及二进制串操作

Python中整数移位及二进制串操作

        最近一个项目涉及到电压数据的接收和可视化处理。其中电压数据是由FPGA通过TCP协议传输的二进制流,软件接收端需要安装数据帧格式进行解析后处理。由于嵌入式组的FPGA发送程序还处于调试阶段,软件接收端需要先自己写个TCP Server模拟数据发送。项目开发语言是Python
以下是数据帧格式的简单定义:
Python中整数移位及二进制串操作_第1张图片
对此数据帧格式的定义其实我个人还是有些看法的!首先是一般数据帧都有header;然后是单通道数据只占用10bit,但是为了对齐32位补了12个零,有点浪费了。不过这个格式是嵌入式组定义的,也不好说什么啦 ?

        那么第一个问题就是在Python中如何将20个bit的两个通道数据和12个bit的补领拼接在一起,形成一个32位的基本数据单元?搜了一下Python的文档,发现Python对二进制串处理相当不友好,根本不能进行类似字符串拼接这类的操作。一筹莫展之下请教了一下大牛,发现自己对于二进制位操作是真的一窍不通!计算机组成原理算是白学了:( 下面进入正题,如何从十进制整数进行位移操作转换为上面截图所示的数据帧格式。

        由FPGA传输过来的电压数据是一个无符号整型(实际电压数据是浮点数,而且有正负,后续还有一个转换的算法,这里不继续透露了),那么假设我们有个通道的电压数据为十进制整数16,该整数转换为32位的二进制数应该是00000000 00000000 00000000 00010000,至于十进制和二进制是如何转换的,如果不会,可以打开文末的参考网站,上面有提供在线转换。我们帧格式定义里面一个通道的数据位是10位,那么该通道的电压数据转为10位二进制数应该是0000010000。如何将这10位二进制数和最后我们需要的32位二进制数拼接起来呢?很简单,我们只需要进行一次移位操作就可以得到了:将16左移22位即可!移位后的二进制串为00000100 00000000 00000000 00000000,其对应的十进制数值为67108864。接下来我们随机产生第二个通道的数据,假设为十进制整数12,其对应的32位二进制数为00000000 00000000 00000000 00001100,问题是如何将12和16在保证顺序和值正确的情况下拼接起来呢?对于我们的目标数据,是一个32位的二进制串,我们的第一个通道数据已经占据了该二进制串的前十位,那么第二个通道的数据应该是从第11位开始。所以第二个通道的数据我们左移位数不是22,而是12。将第二个通道的10bit数据左移12位后得到00000000 00000000 11000000 00000000,其对应的十进制数为49152。移位后的数值和原始数字完全不一样了怎么办?不要慌,这里我们暂时不要关心移位后的数值大小。接下来是关键的一步:将两个通道的数据拼接起来。怎么拼接?直接相加或者做或运算即可!第一个通道移位后的数值67108864加上第二个通道移位后的数值49152后得到67158016,将67158016转换为32位二进制串为0000010000 0000001100 000000000000。仔细看,这个32位二进制串的前十位即为第一个通道的数据0000010000,接下来十位的数据即为第二个通道的数据0000001100,最后十二位即为补的零。是不是很神奇 ?

        接下来将该二进制串使用socket发送,然后接收端再进行右移位反序操作即可解出通道的数据,这里不再继续下去了。

以下是移位操作的简单过程

c1 = 16
b_c1 = c1 << 22
c2 = 12
b_c2 = c2 << 12

print(b_c1)
print(b_c2)
print(b_c1 + b_c2)
print(bin(b_c1 + b_c2))

以下是二进制和整数的相互转换:

# 整数转二进制:
# 1. 采用%2的方式计算
# 2. 采用python自带了方法 bin.
# 比如bin(10) 回返回字符串'0b1010' ,只留下'0','1'序列需要把'0b'去掉.
# bin(number).replace('0b','') 或bin(number)[2:]

>>> bin(10)  # 为了下边表示方便 放入t中
'0b1010'
 
# 二进制转整数:
>>> int(t[2:],2)
10

References:

  1. 在线进制转换:http://www.binaryconvert.com/index.html
  2. python二进制和整数相互转换:https://blog.csdn.net/a1628864705/article/details/52884441

你可能感兴趣的:(Python,软件工程师之路)