Python字节数组到位数组

新手上路,请多包涵

我想用 Python 和 scapy 解析一些数据。因此,我必须分析单个位。但目前我有一些有效负载的 UDP 数据包,例如:

 bytes = b'\x18\x00\x03\x61\xFF\xFF\x00\x05\x42\xFF\xFF\xFF\xFF'

有什么优雅的方法可以转换字节,以便我可以访问单个位,例如:

 bytes_as_bits = convert(bytes)
bit_at_index_42 = bytes_as_bits[42]

原文由 N. Stra 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 664
2 个回答

那可行:

 def access_bit(data, num):
    base = int(num // 8)
    shift = int(num % 8)
    return (data[base] >> shift) & 0x1

如果你想创建一个二进制数组,你可以像这样使用它:

 [access_bit(data,i) for i in range(len(data)*8)]

原文由 Liran Funaro 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您想拥有位字符串,或者不想自己创建函数,我会使用 format() 和 ord(),让我举一个更简单的例子来说明

bytes = '\xf0\x0f'
bytes_as_bits = ''.join(format(ord(byte), '08b') for byte in bytes)

这应该输出:’1111000000001111’

如果你首先想要 LSB,你可以翻转 format() 的输出,所以:

 bytes = '\xf0\x0f'
bytes_as_bits = ''.join(format(ord(byte), '08b')[::-1] for byte in bytes)

这应该输出:’0000111111110000’

现在您想使用 b'\xf0\x0f' 而不是 '\xf0\x0f' 。对于 python2,代码工作相同,但对于 python3,你必须摆脱 ord() 所以:

 bytes = b'\xf0\x0f'
bytes_as_bits = ''.join(format(byte, '08b') for byte in bytes)

翻转字符串是同样的问题。

我在 这里 找到了 format() 功能。以及 此处 的翻转 ([::-1]) 功能。

原文由 ZKK 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题