Python字节数组到位数组

2024-05-19 03:23:14 发布

您现在位置: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]

Tags: 数据bytesas数据包scapybitsudpx00
3条回答

这将起作用:

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

如果要创建二进制数组,可以这样使用:

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

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

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

应输出:“111100000001111”

如果您首先需要LSB,可以直接翻转format()的输出,因此:

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

应输出:“000011111110000”

现在您要使用b'\xf0\x0f',而不是'\xf0\x0f'。对于python2,代码的工作原理是一样的,但是对于python3,您必须去掉ord()以便:

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

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

我找到format()功能here。 以及翻转([::-1])功能here

嗯,在python中不是内置位类型,但是您可以做一些类似的事情

>>> bin(int.from_bytes(b"hello world", byteorder="big")).strip('0b')
'1101000011001010110110001101100011011110010000001110111011011110111001001101100011001'

相关问题 更多 >

    热门问题