Python - 解压缩具有十六进制值和不完全的 DAT 文件

Python - Unpacking a DAT file with Hex values and Incompletely

提问人:Marco Somoza 提问时间:11/1/2023 最后编辑:Marco Somoza 更新时间:11/1/2023 访问量:36

问:

我正在尝试解压缩二进制文件(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')
python 结构 体 binaryfiles sql 加载程序

评论

0赞 Mark Tolonen 11/1/2023
如果没有记录规范,它看起来像是字符串的小端长度,您可以进行后处理以读取以下字符串。此外,在使用 .如果可以,请提供更大的原始数据样本和记录规范。\x07\x00binFile.close()with
0赞 Tim Roberts 11/1/2023
如果您认为您有 800 行相同格式,那么您肯定明白您需要循环直到读取失败。如果您想将文件发布到某个地方,我们中的一些人可以看看。
0赞 Marco Somoza 11/1/2023
我将其提交到谷歌驱动器链接中:drive.google.com/file/d/1hHNQbYVpnJKGG-x2cKuCrsukbiOh41lU/...

答:

0赞 gimix 11/1/2023 #1

答案已经在评论中,但让我们更明确地说明它们。

您正在读取一个标准大小(即 32 位)签名,后跟一个 22 个字符的字符串,但您的数据采用不同的格式:在初始值之后,您有一个“N”(您可能知道为什么),一个短的(16 位)符号,代表实际的字符串长度,最后是您的字符串,零填充。intintint

因此,您应该阅读结构,然后使用如下内容提取实际字符串:

#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 以读取文件中的所有字节块。