解压二进制文件
Unpacking binary files
我必须读取一个二进制文件。所以我完全沉浸在 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~�
我连续打包了 2 个浮点数、一个 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
是的,它是原始二进制数据,所以您需要告诉 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)
我必须读取一个二进制文件。所以我完全沉浸在 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~�
我连续打包了 2 个浮点数、一个 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
是的,它是原始二进制数据,所以您需要告诉 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)