解压缩二进制文件

时间:2016-01-25 15:29:54

标签: python python-2.7 binaryfiles unpack

我必须读取二进制文件。所以我完全沉浸在python struct模块中。 然而,仍有一些事情让我感到困惑。让我们考虑以下代码块:

import struct

print struct.pack('5c', *'Hello')
to_pack = (5.9, 14.87, 'HEAD', 32321, 238, 99)
packed = struct.pack('2f4s3i', *to_pack)
print "packed: ", packed

输出:

Hello
packed:  �̼@��mAHEADA~�

我先后打包了两个浮点数,一个4个字符串和三个整数。 然后解压时:

unpacked = struct.unpack('2f4s3i', packed)
print "unpacked: ", unpacked

输出:

 unpacked:  (5.900000095367432, 14.869999885559082, 'HEAD', 32321, 238, 99)

因此打包功能将我的原始数据转换为二进制数据,而解包则完成了 相反。但是,这是否意味着我必须知道我的数据是如何组织的,是吗? 必须知道哪些类型被编码,以及它们各自的顺序? 如果我不这样做,我怎么能猜出数据的正确类型顺序呢?例如,如果我这样做:

unpacked = struct.unpack('2f4s3h', packed)  # I replaced the 3i with 3h 
print "unpacked: ", unpacked

我会得到一个很好的错误:

unpacked = struct.unpack('2f4s3h', packed)
struct.error: unpack requires a string argument of length 18

所以在我看来,无论读取二进制文件时得到的二进制数据是什么,如果 我不知道正确顺序的正确类型,我无法将其转换为原始类型 形式。

有没有办法将数据转换回非二进制文件而不指定预期的类型, 或者我真的会被一个不可用的二进制文件困住?

我的意思是,即使在那些从巨大的二进制文件中创建巨大的二进制文件的人中,他们也是如此 设法成功检索他们的数据?

有关信息,我的示例来自此pdf文件:https://gebloggendings.files.wordpress.com/2012/07/struct.pdf

1 个答案:

答案 0 :(得分:1)

是的,它是原始二进制数据,因此您需要告诉Python有关其结构的信息,以便有效地解压缩它。 Python不知道你在packed中创建的24字节数据块是6个浮点数,还是6个整数,或3个双精度数,或者它们的任意组合,或完全不同的东西。

>>> unpack('6f', packed)
(5.900000095367432, 14.869999885559082, 773.08251953125, 4.5291367665442413e-41, 3.3350903450930646e-43, 1.3872854796815689e-43)
>>> unpack('6i', packed)
(1086115021, 1097722757, 1145128264, 32321, 238, 99)
>>> unpack('3d', packed)
(15686698.023046875, 6.8585591728324e-310, 2.10077583423e-312)
>>> unpack('dfid', packed)
(15686698.023046875, 773.08251953125, 32321, 2.10077583423e-312)