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

时间:2013-02-15 21:42:45

标签: python serial-port byte arduino

我目前正在使用Arduino通过Serial(使用pySerial)将一些整数(int)输出到我正在为ArduinoX-Plane进行通信而编写的Python脚本{1}},飞行模拟程序。

我设法将原始文件分成两个字节,以便我可以将它发送到脚本,但是我在重建原始整数时遇到了一些麻烦。

我尝试使用基本的按位运算符(<<,>>等),就像我在C ++程序中所做的那样,但似乎没有用。

我怀疑它与数据类型有关。我可能在相同的操作中使用带有字节的整数,但我无法确定每个变量的类型,因为你并不真正在Python中声明变量,据我所知(我对Python很新) 。

self.pot=self.myline[2]<<8
self.pot|=self.myline[3]

5 个答案:

答案 0 :(得分:5)

您可以使用struct模块将整数和表示形式转换为字节。在您的情况下,要将Python整数转换为两个字节并返回,您可以使用:

>>> import struct
>>> struct.pack('>H', 12345)
'09'
>>> struct.unpack('>H', '09')
(12345,)

struct.packstruct.unpack的第一个参数表示您希望如何格式化数据。在这里,我要求使用>前缀处于大结局模式(您可以将<用于little-endian,或将=用于本机)然后我说那里是由H表示的单个无符号短整数(16位整数)。

对于有符号字节,其他可能性为b,无符号字节为B,有符号短(16位)为h,有符号32为i -bits integer,I表示无符号的32位整数。您可以通过查看struct模块的文档来获取完整列表。

答案 1 :(得分:2)

假设存储在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"

答案 2 :(得分:0)

这完全奏效:

long = 500
first = long & 0xff  #244
second = long >> 8  #1
result = (second << 8) + first #500

如果您不确定'myline'中的类型,请查看Stack Overflow问题 How to determine the variable type in Python?

答案 3 :(得分:0)

例如,使用大端编码:

int.from_bytes(my_bytes, byteorder='big')

答案 4 :(得分:-1)

要将字节或字符转换为它所代表的数字,请使用ord()。这是一个从int到bytes和back的简单往返:

>>> number = 3**9
>>> hibyte = chr(number / 256)
>>> lobyte = chr(number % 256)
>>> hibyte, lobyte
('L', '\xe3')
>>> print number == (ord(hibyte) << 8) + ord(lobyte)
True

如果您的myline变量是字符串或字节字符串,则可以使用上面最后一行中的公式。如果它以某种方式是整数列表,那么当然你不需要ord