如何在Python中将两个字节转换回整数?

9 投票
5 回答
21647 浏览
提问于 2025-04-17 16:03

我现在正在使用一个 Arduino,它通过串口输出一些整数(int),然后我用 pySerial 把这些数据传给我正在写的 Python 脚本,这个脚本是为了让 ArduinoX-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.packstruct.unpack 这两个函数中,第一个参数是用来告诉你想要数据的格式。在这里,我使用 > 前缀来表示大端模式(big-endian),也就是说高位在前。如果你想用小端模式(little-endian),可以用 <,而 = 则表示使用本地字节顺序。接着,我用 H 表示有一个无符号短整型(16位整数)。

还有其他的选项,比如 b 表示有符号字节,B 表示无符号字节,h 表示有符号短整型(16位),i 表示有符号32位整数,I 表示无符号32位整数。你可以查看 struct 模块的文档来获取完整的列表。

撰写回答