Python字节数组到位数组

N. *_*tra 5 python byte bit-manipulation type-conversion bit

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

bytes = b'\x18\x00\x03\x61\xFF\xFF\x00\x05\x42\xFF\xFF\xFF\xFF'
Run Code Online (Sandbox Code Playgroud)

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

bytes_as_bits = convert(bytes)
bit_at_index_42 = bytes_as_bits[42]
Run Code Online (Sandbox Code Playgroud)

Lir*_*aro 6

那可行:

def access_bit(data, num):
    base = int(num // 8)
    shift = int(num % 8)
    return (data[base] & (1<<shift)) >> shift
Run Code Online (Sandbox Code Playgroud)

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

[access_bit(data,i) for i in range(len(data)*8)]
Run Code Online (Sandbox Code Playgroud)


ZKK*_*ZKK 5

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

bytes = '\xf0\x0f'
bytes_as_bits = ''.join(format(ord(byte), '08b') for byte in bytes)
Run Code Online (Sandbox Code Playgroud)

这应该输出:'1111000000001111'

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

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

这应该输出:'0000111111110000'

现在你想使用b'\xf0\x0f'而不是'\xf0\x0f'. 对于 python2,代码的工作原理相同,但是对于 python3,你必须去掉 ord() 所以:

bytes = b'\xf0\x0f'
bytes_as_bits = ''.join(format(byte, '08b') for byte in bytes)
Run Code Online (Sandbox Code Playgroud)

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

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