使用 8 位编码将二进制转换为字节数组
Convert binary to bytearray with 8bit encoding
我正在编写代码来创建要使用特定协议通过 CANBUS 发送的消息。此类消息的数据字段的示例格式为:
[from_address(1 字节)][control_byte(1 字节)][标识符(3 字节)][长度(3 字节)]
数据字段需要格式化为列表或字节数组。我的代码目前执行以下操作:
data = dataFormat((from_address << 56)|(control_byte << 48)|(identifier << 24)|(length))
其中数据格式定义如下:
def dataFormat(num):
intermediary = BitArray(bin(num))
return bytearray(intermediary.bytes)
这正是我想要的,除非 from_address 是一个可以用少于 8 位描述的数字。在这些情况下 bin()
returns 二进制字符长度不能被 8 整除(多余的零被丢弃),因此 intermediary.bytes
抱怨转换不明确:
InterpretError: Cannot interpret as bytes unambiguously - not multiple of 8 bits.
我不受上述代码中的任何限制 - 任何采用整数序列并将其转换为字节数组(以字节为单位正确调整大小)的方法都将不胜感激。
如果它是您想要的 bytearray
,那么简单的选择就是直接跳到那里并直接构建它。像这样:
# Define some values:
from_address = 14
control_byte = 10
identifier = 80
length = 109
# Create a bytearray with 8 spaces:
message = bytearray(8)
# Add from and control:
message[0] = from_address
message[1] = control_byte
# Little endian dropping in of the identifier:
message[2] = identifier & 255
message[3] = (identifier >> 8) & 255
message[4] = (identifier >> 16) & 255
# Little endian dropping in of the length:
message[5] = length & 255
message[6] = (length >> 8) & 255
message[7] = (length >> 16) & 255
# Display bytes:
for value in message:
print(value)
Here's a working example of that.
健康警告
以上假定消息应为little endian。在 Python 中也可能内置了执行此操作的方法,但它不是我经常使用的语言。
我正在编写代码来创建要使用特定协议通过 CANBUS 发送的消息。此类消息的数据字段的示例格式为:
[from_address(1 字节)][control_byte(1 字节)][标识符(3 字节)][长度(3 字节)]
数据字段需要格式化为列表或字节数组。我的代码目前执行以下操作:
data = dataFormat((from_address << 56)|(control_byte << 48)|(identifier << 24)|(length))
其中数据格式定义如下:
def dataFormat(num):
intermediary = BitArray(bin(num))
return bytearray(intermediary.bytes)
这正是我想要的,除非 from_address 是一个可以用少于 8 位描述的数字。在这些情况下 bin()
returns 二进制字符长度不能被 8 整除(多余的零被丢弃),因此 intermediary.bytes
抱怨转换不明确:
InterpretError: Cannot interpret as bytes unambiguously - not multiple of 8 bits.
我不受上述代码中的任何限制 - 任何采用整数序列并将其转换为字节数组(以字节为单位正确调整大小)的方法都将不胜感激。
如果它是您想要的 bytearray
,那么简单的选择就是直接跳到那里并直接构建它。像这样:
# Define some values:
from_address = 14
control_byte = 10
identifier = 80
length = 109
# Create a bytearray with 8 spaces:
message = bytearray(8)
# Add from and control:
message[0] = from_address
message[1] = control_byte
# Little endian dropping in of the identifier:
message[2] = identifier & 255
message[3] = (identifier >> 8) & 255
message[4] = (identifier >> 16) & 255
# Little endian dropping in of the length:
message[5] = length & 255
message[6] = (length >> 8) & 255
message[7] = (length >> 16) & 255
# Display bytes:
for value in message:
print(value)
Here's a working example of that.
健康警告
以上假定消息应为little endian。在 Python 中也可能内置了执行此操作的方法,但它不是我经常使用的语言。