我目前正在使用Arduino
通过Serial(使用pySerial
)将一些整数(int)输出到我正在为Arduino
与X-Plane
进行通信而编写的Python脚本{1}},飞行模拟程序。
我设法将原始文件分成两个字节,以便我可以将它发送到脚本,但是我在重建原始整数时遇到了一些麻烦。
我尝试使用基本的按位运算符(<<,>>等),就像我在C ++程序中所做的那样,但似乎没有用。
我怀疑它与数据类型有关。我可能在相同的操作中使用带有字节的整数,但我无法确定每个变量的类型,因为你并不真正在Python中声明变量,据我所知(我对Python很新) 。
self.pot=self.myline[2]<<8
self.pot|=self.myline[3]
答案 0 :(得分:5)
您可以使用struct
模块将整数和表示形式转换为字节。在您的情况下,要将Python整数转换为两个字节并返回,您可以使用:
>>> import struct
>>> struct.pack('>H', 12345)
'09'
>>> struct.unpack('>H', '09')
(12345,)
struct.pack
和struct.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
。