【发布时间】:2020-05-20 09:07:21
【问题描述】:
我必须对 CAN 总线有效负载消息(8 个字节)应用位掩码以过滤 Python 3 中的单个信号(消息中有多个信号),我的输入是:
- 我要以二进制形式过滤的信号长度(考虑一组“1”)。
- 信号的起始位置。 问题是信号可以从一个字节的中间开始,占用超过1个字节。
例如,我必须过滤起始位位置 = 50 且长度 = 10 的信号 掩码将是字节 6 = (00111111) 和字节 7 = (11000000)。所有其他字节设置为 0。
我尝试用 1 构建一个字节数组,然后应用 |使用一个空的 8 字节长度数组来获得掩码。并且还直接创建了 8 字节数组,但无法实现如何正确按位计算起始位置。 我尝试使用 bitstring 模块和 bytearray 但找不到好的解决方案。
有人可以帮忙吗?
非常感谢。
编辑:如果信号在字节中间开始,则添加非功能代码:
my_mask_byte = [0, 0, 0, 0, 0, 0, 0, 0]
message_bit_pos = 50
message_signal_lenght = 10
byte_pos = message_bit_pos // 8
bit_pos = message_bit_pos % 8
for i in range(0, message_signal_lenght):
if i < 8:
my_mask_byte[byte_pos + i // 8] = 1 << i + bit_pos | my_mask_byte[byte_pos + i // 8]
else:
my_mask_byte[byte_pos + i // 8] = 1 << i-8 | my_mask_byte[byte_pos + i // 8]
for byte in my_mask_byte:
print(bin(byte))
【问题讨论】:
-
您介意提供一个您尝试过的代码示例吗?
-
感谢@Serbitar 的提问
-
为什么不只创建一个(64 位宽)掩码而不是尝试构建 8 个不同的字节?
标签: python arrays bit-manipulation can-bus