在struct library中解压缩python中的数据

时间:2013-06-10 12:41:57

标签: python-2.7 struct binary-data packing

当我将数据打包到固定长度然后在解压缩时,我无法检索数据而没有提到数据的实际长度。

如何在不计算之前的长度的情况下,仅检索没有\ x00字符的数据。

>>> import struct
>>> with open("forums_file.dat", "w") as file:
    file.truncate(1024)
>>> country = 'india'
>>> data = struct.pack('20s', country)
>>> print data
    india
>>> data
    'india\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> print len(data)
    20
>>> unpack_data = struct.unpack('5s', country)
>>> unpack_data
    ('india',)

在上面的代码片段中,我提到了解包时数据的长度(5s)。

1 个答案:

答案 0 :(得分:0)

简短回答:你不能直接做到。

更长的答案:

更间接的解决方案实际上并没有那么糟糕。打开包装时,使用与包装相同的长度。返回包含NUL字符(0字节)的字符串。

然后你拆分NUL char并取出第一个项目,如下所示:

result_with_NUL, = struct.unpack('20s', data)
print(repr(result_with_NUL))

result_string = result_with_NUL.split('\x00', 1)[0]
print(repr(result_string))

, 1中的split()参数并非绝对必要,但会提高效率,因为它只会在第一次出现NUL而不是每一次出现时分割。

另请注意,当packunpack目标读取/写入文件或与不同系统交换数据时,务必在格式字符串前面加上“<”或“>” (或在某些非常特殊的情况下为“=”),包装和拆包都是如此,否则会对齐和填充结构,这在很大程度上取决于系统,可能导致以后很难发现错误。