如何在Python中将两个字节转换回整数?
我现在正在使用一个 Arduino
,它通过串口输出一些整数(int),然后我用 pySerial
把这些数据传给我正在写的 Python 脚本,这个脚本是为了让 Arduino
和 X-Plane
(一个飞行模拟程序)进行通信。
我成功地把原来的整数分成了两个字节,这样就可以发送给脚本了,但在重建原来的整数时遇到了一些麻烦。
我尝试使用基本的位运算符(比如 <<、>> 等),就像在 C++ 程序中那样,但似乎没有效果。
我怀疑这可能和数据类型有关。我可能在同一操作中混用了整数和字节,但我不太确定每个变量的类型,因为在 Python 中你并不需要像其他语言那样声明变量(我对 Python 还很陌生)。
self.pot=self.myline[2]<<8
self.pot|=self.myline[3]
5 个回答
3
比如,使用大端编码(Big Endian):
int.from_bytes(my_bytes, byteorder='big')
3
你现在的代码看起来基本上是可以工作的,前提是你在myline
里存储的数据是高字节在前面:
myline = [0, 1, 2, 3]
pot = myline[2]<<8 | myline[3]
print 'pot: {:d}, 0x{:04x}'.format(pot, pot) # outputs "pot: 515, 0x0203"
如果数据是低字节在前面的话,你就需要反过来处理:
myline = [0, 1, 2, 3]
pot = myline[3]<<8 | myline[2]
print 'pot: {:d}, 0x{:04x}'.format(pot, pot) # outputs "pot: 770, 0x0302"
10
你可以使用 struct
模块来在整数和字节表示之间转换。比如说,如果你想把一个Python整数转换成两个字节,然后再转换回来,可以这样做:
>>> import struct
>>> struct.pack('>H', 12345)
'09'
>>> struct.unpack('>H', '09')
(12345,)
在 struct.pack
和 struct.unpack
这两个函数中,第一个参数是用来告诉你想要数据的格式。在这里,我使用 >
前缀来表示大端模式(big-endian),也就是说高位在前。如果你想用小端模式(little-endian),可以用 <
,而 =
则表示使用本地字节顺序。接着,我用 H
表示有一个无符号短整型(16位整数)。
还有其他的选项,比如 b
表示有符号字节,B
表示无符号字节,h
表示有符号短整型(16位),i
表示有符号32位整数,I
表示无符号32位整数。你可以查看 struct
模块的文档来获取完整的列表。