Python字节数组到位数组

时间:2017-05-04 15:24:40

标签: python type-conversion bit-manipulation byte bit

我想用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]

4 个答案:

答案 0 :(得分:2)

这将有效:

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

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

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

答案 1 :(得分:1)

如果您想拥有bits字符串,或者想避免创建函数,我将使用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()功能here。 以及翻转([::-1])功能here

答案 2 :(得分:0)

嗯,python中没有内置的比特类型,但你可以做类似

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

答案 3 :(得分:0)

from bs4 import BeautifulSoup

data = """
    <tr>
        <td class="chu17 need_blank">42</td>
        <td class="chu17 need_blank">46</td>
        <td class="chu17 need_blank">46</td>
        <td class="chu17 need_blank">46</td>
        <td class="chu17 need_blank">49</td>
        <td class="chu17 need_blank">49</td>
        <td class="chu17 need_blank">61</td>
        <td class="chu17 need_blank">62</td>
        <td class="chu17 need_blank">69</td>
    </tr>"""
soup = BeautifulSoup(data, 'html.parser')
numbers = soup.find_all('td', {'class': 'chu17 need_blank'})
for number in numbers:
    print(number.text)