在不知字符串内容的情况下使用 struct.unpack()

0 投票
1 回答
968 浏览
提问于 2025-04-17 21:36

我需要解析一个大端格式的二进制文件,并把它转换成小端格式。不过,把这个文件交给我的人似乎对里面的数据类型和组织结构一无所知——他们唯一确定的就是这个文件是一个包含一些旧数据的大端二进制文件。不过,使用 struct.unpack() 函数时,它的第一个参数需要一个格式字符。

这是这个二进制文件的第一行:

import binascii
path = "BC2003_lr_m32_chab_Im.ised"            
with open(path, 'rb') as fd:
    line = fd.readline()
    print binascii.hexlify(line)

a0040000dd0000000000000080e2f54780f1094840c61a4800a92d48c0d9424840a05a48404d7548e09d8948a0689a48e03fad48a063c248c01bda48c0b8f448804a0949100b1a49e0d62c49e0ed41499097594900247449a0a57f4900d98549b0278c49a0c2924990ad9949a0eba049e080a8490072b049c0c2b849d077c1493096ca494022d449a021de49a099e849e08ff349500a

在不知道文件内容的情况下,有可能改变文件的字节序吗?

1 个回答

5

你不能在不知道数据类型的情况下进行操作。否则这样做几乎没有意义。

即使你处理的是同一种数据类型的序列,你也仍然需要知道你在处理什么;在double类型的值中翻转字节顺序和在short整数中翻转字节顺序是完全不同的事情。

看看这个格式字符表;任何字节大小不同的东西都会导致交换的字节集合不同;例如,对于double类型的值,你需要反转每8个字节的顺序。

如果你知道文件中应该包含什么数据,至少你有了一个起点;你需要弄清楚这些值是如何适应给定的字节的。这会是一个难题,但有了目标值,你可以建立一个包含数据类型的映射,然后再写一个字节顺序调整的脚本。如果连这个都没有,最好不要开始,因为这个任务是无法完成的。

撰写回答