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

2024-05-17 08:20:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在使用一个Arduino,它通过串行(使用pySerial)将一些整数(int)输出到一个Python脚本,我正在编写该脚本,以便Arduino与飞行模拟程序X-Plane通信。

我设法将原始数据分为两个字节,以便可以将其发送到脚本,但是我在重建原始整数时遇到了一些问题。

<>我尝试过基本的位运算符(& lt;& lt;& gt;gt;等),就像我在C++程序中所做的那样,但是它似乎不起作用。

我怀疑这与数据类型有关。我可能在同一个操作中使用带字节的整数,但我无法真正区分每个变量的类型,因为据我所知,您并没有在Python中真正声明变量(我对Python很陌生)。

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

Tags: ltgtself脚本原始数据字节整数arduino
3条回答

这完全有效:

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

如果您不确定“myline”中的类型,请检查堆栈溢出问题How to determine the variable type in Python?

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

您可以使用struct模块在整数和字节表示之间进行转换。在您的例子中,要从Python整数转换为两个字节并返回,您可以使用:

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

struct.packstruct.unpack的第一个参数表示希望如何格式化数据。在这里,我要求它使用>前缀(可以使用<表示小尾数,也可以使用=表示原生尾数),然后我说有一个由H表示的单无符号短(16位整数)。

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

相关问题 更多 >