提问人:Marco Somoza 提问时间:11/1/2023 最后编辑:Marco Somoza 更新时间:11/1/2023 访问量:36
Python - 解压缩具有十六进制值和不完全的 DAT 文件
Python - Unpacking a DAT file with Hex values and Incompletely
问:
我正在尝试解压缩二进制文件(file.dat),但它只是解压缩一行,而它有 800 多个,当我打印 struct.unpack() 的结果时,字符串字段给了我很多十六进制值,有没有办法删除这些十六进制值和其他不需要的字符(如“N”)?我有实际的以下代码:
with open(f'file.dat', mode="rb") as binFile:
binData = binFile.read(26)
data = struct.unpack('i22s', binData)
print(data)
binFile.close()
它给了我以下结果,整数值是正确的,但字符串只需要“PROV111”。此外,正如您所看到的,它只读取一条记录:
(1000000054, b'N\x07\x00PROV111\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
答:
0赞
gimix
11/1/2023
#1
答案已经在评论中,但让我们更明确地说明它们。
您正在读取一个标准大小(即 32 位)签名,后跟一个 22 个字符的字符串,但您的数据采用不同的格式:在初始值之后,您有一个“N”(您可能知道为什么),一个短的(16 位)符号,代表实际的字符串长度,最后是您的字符串,零填充。int
int
int
因此,您应该阅读结构,然后使用如下内容提取实际字符串:
#the format string looks for an int, a dummy char, a short int, the string
number, dummy, str_len, padded_str = struct.unpack('ish19s', binData)
true_str = padded_str[:str_len]
print(number, true_str)
是的,当然,您应该循环直到 EOF 以读取文件中的所有字节块。
评论
\x07\x00
binFile.close()
with