6

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

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

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

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

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

5 回答 5

8

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

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

第一个参数struct.packstruct.unpack表示您希望如何格式化数据。>在这里,我通过使用前缀(您可以<用于 little-endian 或native)来要求它处于大结尾模式=,然后我说有一个由H.

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

于 2013-02-16T12:37:15.423 回答
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"
于 2013-02-15T22:19:58.440 回答
1

例如,使用 Big Endian 编码:

int.from_bytes(my_bytes, byteorder='big')
于 2021-02-08T06:41:02.677 回答
0

这完全有效:

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

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

于 2013-02-15T21:49:54.287 回答
-1

要将字节或字符转换为其表示的数字,请使用ord(). 这是从 int 到 bytes 并返回的简单往返:

>>> 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.

于 2013-02-15T21:56:19.023 回答