我需要解析一个big-endian二进制文件并将其转换为little-endian。但是,将文件交给我的人似乎无法告诉我它包含的数据类型或组织方式 - 他们唯一知道的是它是一个带有<的大端二进制文件em>一些旧数据。但是,函数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
是否可以在不知道任何内容的情况下更改文件的字节顺序?
答案 0 :(得分:3)
如果不知道数据类型,则无法执行此操作。试图这样做没有什么意义。
即使它是一种数据类型的同构序列,你仍然需要知道你在处理什么;翻转double
值中的字节顺序与short
整数非常不同。
看看formatting characters table;任何字节大小不同的东西都会导致交换不同的字节集;对于double
值,您需要反转每8个字节的顺序,例如。
如果你知道应该在文件中的数据,那么至少你有一个起点;你必须弄清楚这些值如何适合给定的字节。这将是一个难题,但是使用一组目标值,您可以构建包含的数据类型的映射,然后编写一个字节顺序调整脚本。如果你甚至没有这个,最好不要开始,因为任务是不可能实现的。