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

Gep*_*ado 3 python byte serial-port arduino

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

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

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

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

self.pot=self.myline[2]<<8
self.pot|=self.myline[3]
Run Code Online (Sandbox Code Playgroud)

Syl*_*sne 5

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

>>> import struct
>>> struct.pack('>H', 12345)
'09'
>>> struct.unpack('>H', '09')
(12345,)
Run Code Online (Sandbox Code Playgroud)

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

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


fsw*_*fsw 0

这完全有效:

long = 500
first = long & 0xff  #244
second = long >> 8  #1
result = (second << 8) + first #500
Run Code Online (Sandbox Code Playgroud)

如果您不确定“myline”中的类型,请检查 Stack Overflow 问题如何确定 Python 中的变量类型?