Python 3.6 - 拆分十六进制数据

问题描述 投票:0回答:1

我正在尝试读取二进制文件并获得一个utf-8格式的标头。但是,文件的其余部分的字节值超过了十进制127,因此我无法将其转换为字符串。我必须将文本拆分为; (或0x3B),我无法让它工作。

with open("test_qifs_single_frame.qifs", "rb") as file:
    data = file.read()

print(binascii.hexlify(data))

我也无法将其作为字符串读取,因为它告诉我无法将0x81解码为UTF-8。据我所知,它超出了ASCII范围。我该怎么做才能解决这个问题?

python-3.x split binary hex
1个回答
0
投票

您可以逐字节读取文件,直到到达停止字符,然后解码您已读取的数据。

创建一些示例数据

>>> from random import randint
>>> header = 'Heaðer;'.encode('utf-8')
>>> bs = b''.join(bytes.fromhex('{:0>2x}'.format(randint(0, 255))) for _ in range(56))
>>> with open('test_qifs_single_frame.qifs', 'wb') as f:
...     f.write(header + bs)
>>>

从文件中读取标题

>>> # Create a bytearray to hold the bytes that we read.
>>> ba = bytearray()

>>> import functools
>>> with open('test_qifs_single_frame.qifs', 'rb') as f:
...     breader = functools.partial(f.read, 1)
...     for b in iter(breader, b';'):
...         ba += b
... 
>>> ba
bytearray(b'Hea\xc3\xb0er')
>>> ba.decode('utf-8')
'Heaðer'

如果iter builtin传递了一个callable和一个值,它将调用callable,直到它返回值。在代码中,我们使用functools.partial创建一个函数,一次读取一个字节的文件,然后将其传递给iter

© www.soinside.com 2019 - 2024. All rights reserved.