2017-01-30 42 views
0

我正在编写创建使用特定协议通过CANBUS发送消息的代码。这样的消息的数据字段的示例格式是:使用8位编码将二进制转换为bytearray

[FROM_ADDRESS(1个字节)] [control_byte(1个字节)] [标识符(3个字节)] [长度(3个字节)]

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

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(以字节为单位的正确大小)将不胜感激。

+0

这需要标签[tag:can]用于什么? – usr2564301

+0

@RadLexus它是can消息的一部分。我想,这与手边的问题没有特别的关系。 – oirectine

+0

为什么不使用CAN控制器寄存器的消息结构?标识符和长度是CAN帧的专用字段,而其他的东西必须存储在数据字段中。 – Lundin

回答

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的方式构建,但它不是我经常使用的语言。

相关问题