gpt4 book ai didi

python-3.x - 使用 Python 和内存映射在二进制文件中查找位模式

转载 作者:行者123 更新时间:2023-12-01 05:51:47 26 4
gpt4 key购买 nike

我正在处理一个在开始时不是字节对齐的二进制文件。在文件中不久有一个 24 位模式 0xfaf330,它是一个同步标记,用于标记后续字节对齐数据。我在文件上使用 Python mmap 并希望在找到标记来处理文件的其余部分后使用 Python memoryview。那么,我如何找到 24 位模式,然后从那时起使用 mmap 和 memoryview?

最佳答案

如果不需要随机访问,可以使用open流式传输文件。使用 file.read ,您可以从文件中获取连续的字节。如果您的文件是字节对齐的,您可以直接搜索它:

in_stream = open('/dev/urandom', 'rb')
# discard individual bytes until first marker byte
while in_stream.peek(1) != b'\xfa\xf3\x30':
in_stream.read(1)
# in_stream is now positioned directly after the marker
print(in_stream.tell())

默认情况下, open使用 small read buffer but never loads the entire file .您可以进一步使用 in_stream.read 流式传输文件调用。

或者,您可以使用 in_stream.tell() 的结果跳转到 mmap'ed 文件中的正确位置。

搜索非对齐位

要管理非字节对齐的数据,您必须手动筛选字节:位移允许检查字节的子范围。请注意,Python 只允许位移 int ,不是 bytes .
>>> pattern = 0xfaf330
>>> bin((pattern << 4) + 0b1011) # pattern shifted by 4 plus garbage
0b1111101011110011001100001011

您可以使用它来扫描字节窗口:
def find_bits(pattern: int, window: int, n: int):
"""Find an n-byte bit pattern in an n+1-byte window and return the offset"""
for offset in range(8):
window_slice = (window >> offset) & (2 ** (n*8) -1)
if pattern == window_slice:
return offset
raise IndexError('pattern not in window')

您可以再次使用它来扫描文件流:
in_stream = open('/dev/urandom', 'rb')
# discard individual bytes until first marker byte
while True:
try:
offset = find_bits(
0xfaf330,
int.from_bytes(in_stream.peek(3)[:4], 'big'),
3
)
except IndexError:
in_stream.read(1)
else:
break
# in_stream is now positioned directly after the marker
print('byte-offset:', in_stream.tell(), 'bit-offset:', offset)

或者,您可以使用二进制表示从字面上查找窗口中的模式。请注意,您必须注意填充零位,因此它的工作大致相同。

读取非对齐位

获得位偏移后,您可以从文件中读取和对齐数据。基本上,读取比您需要的多一个字节,然后根据需要进行移位:
def align_read(file, num_bytes: int, bit_offset: int):
if bit_offset == 0:
return file.read(num_bytes)
window = file.peek(num_bytes + 1)[:num_bytes + 1]
file.read(num_bytes)
data = (int.from_bytes(window, 'big') >> bit_offset) & (2 ** (num_bytes*8) - 1)
return data.to_bytes(num_bytes, 'big')

关于python-3.x - 使用 Python 和内存映射在二进制文件中查找位模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53319850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com