使用8位编码将二进制转换为bytearray

时间:2017-01-30 22:10:56

标签: python arrays binary can-bus

我正在编写代码,用于创建使用特定协议通过CANBUS发送的消息。这种消息的数据字段的示例格式是:

[from_address(1 byte)] [control_byte(1 bytes)] [identifier(3 bytes)] [length(3 bytes)]

数据字段需要格式化为列表或bytearray。我的代码目前执行以下操作:

 data = dataFormat((from_address << 56)|(control_byte << 48)|(identifier << 24)|(length))

其中dataFormat的定义如下:

 def dataFormat(num):
     intermediary = BitArray(bin(num))
     return bytearray(intermediary.bytes)

这正是我想要的,除了from_address是一个可以用少于8位描述的数字。在这些情况下,bin()返回一个不能被8整除的字符长度的二进制数(丢弃了无关的零),因此intermediary.bytes抱怨转换是不明确的:

 InterpretError: Cannot interpret as bytes unambiguously - not multiple of 8 bits.

我没有绑定上面代码中的任何内容 - 任何获取整数序列并将其转换为bytearray(具有正确的字节大小)的方法都将非常感激。

1 个答案:

答案 0 :(得分:2)

如果它是您想要的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中也可能存在这样做的方法,但它不是我经常使用的语言。