在 Python 中,如何将 0 到 255 之间的整数转换为单个无符号字节?
In Python, how can I convert an integer between 0 and 255 to a single unsigned byte?
我的笔记本电脑运行一个 Python 程序,该程序读取操纵杆以向 Arduino 发送速度命令,Arduino 进而控制玩具车上的电机。为此,程序将值介于 0 和 255 之间的整数转换为单个无符号字节,并通过串行连接发送到 Arduino。
这段代码可以做到这一点:
if event.axis == axis:
speed = int((event.value + 1.0) / 2.0 * 255.0)
speedCommand = bytearray(b'\x00')
speedCommand[0] = speed
speedCommand = bytes(speedCommand)
ser.write(speedCommand)
print(speed, speedCommand)
虽然该代码有效,但不是很优雅。我想找到一个单行指令,它与以“speedCommand”开头的三行指令做同样的事情。我试过这个,例如:
speedCommand = chr(speed).encode()
但它只适用于 0 到 127。任何大于 127 的数字都编码为两个字节[,因为该字符被视为带符号的字节,其值大于 127 为负]。
编辑添加:我的假设“该字符被视为一个带符号的字节,其值大于 127 为负数”可能不正确。
您只需要:
speed_command = bytes([speed])
bytes
构造函数接受一个可迭代的 int
对象,所以当你将它传递给构造函数时,只需将它放在一个列表中。
您可以使用 struct
内置模块中的 pack
方法。它以一种格式作为第一个参数,并将一个值(或多个值)作为下一个参数以打包到此格式中。对于 unsigned char
,要求的格式是 B
。该模块支持许多其他格式,这可能有助于将其他数据发送到您的 Arduino。参见 the struct
module documentation for more information, including a list of format characters。
>>> import struct
>>> speed = 255
>>> struct.pack('B', speed)
b'\xff'
我的笔记本电脑运行一个 Python 程序,该程序读取操纵杆以向 Arduino 发送速度命令,Arduino 进而控制玩具车上的电机。为此,程序将值介于 0 和 255 之间的整数转换为单个无符号字节,并通过串行连接发送到 Arduino。
这段代码可以做到这一点:
if event.axis == axis:
speed = int((event.value + 1.0) / 2.0 * 255.0)
speedCommand = bytearray(b'\x00')
speedCommand[0] = speed
speedCommand = bytes(speedCommand)
ser.write(speedCommand)
print(speed, speedCommand)
虽然该代码有效,但不是很优雅。我想找到一个单行指令,它与以“speedCommand”开头的三行指令做同样的事情。我试过这个,例如:
speedCommand = chr(speed).encode()
但它只适用于 0 到 127。任何大于 127 的数字都编码为两个字节[,因为该字符被视为带符号的字节,其值大于 127 为负]。
编辑添加:我的假设“该字符被视为一个带符号的字节,其值大于 127 为负数”可能不正确。
您只需要:
speed_command = bytes([speed])
bytes
构造函数接受一个可迭代的 int
对象,所以当你将它传递给构造函数时,只需将它放在一个列表中。
您可以使用 struct
内置模块中的 pack
方法。它以一种格式作为第一个参数,并将一个值(或多个值)作为下一个参数以打包到此格式中。对于 unsigned char
,要求的格式是 B
。该模块支持许多其他格式,这可能有助于将其他数据发送到您的 Arduino。参见 the struct
module documentation for more information, including a list of format characters。
>>> import struct
>>> speed = 255
>>> struct.pack('B', speed)
b'\xff'