【问题标题】:Add mask to a byte-array knowing bits length and starting position将掩码添加到知道位长度和起始位置的字节数组
【发布时间】: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


【解决方案1】:

字节 6 = (00111111) 和字节 7 = (11110000)

由于长度为 10,因此您错过了 2 位。


您可以使用 numpy 轻松实现此目的:

import numpy as np

message_bit_pos = 50
message_signal_length = 10

mask = np.uint64(0)
while message_signal_length > 0:
    mask |= np.uint64(1 << (64-50-message_signal_length))
    message_signal_length -= 1
print(f'mask: 0b{mask:064b}')

n = np.uint64(0b0000000000000000011000000000000000000000000000000011111111000000)
print(f'n:    0b{n:064b}')
n &= mask
print(f'n&m:  0b{n:064b}')

输出:

mask: 0b0000000000000000000000000000000000000000000000000011111111110000
n:    0b0000000000000000011000000000000000000000000000000011111111000000
n&m:  0b0000000000000000000000000000000000000000000000000011111111000000

【讨论】:

    猜你喜欢
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2021-07-15
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多