我想用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]
答案 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)
翻转字符串是同样的问题。
答案 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)