在struct库中解包python数据



当我将数据打包为固定长度时,然后在拆包时,我无法检索数据而不提及数据的实际长度。

如何只检索没有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
    'indiax00x00x00x00x00x00x00x00x00x00x00x00x00x00x00'
>>> print len(data)
    20
>>> unpack_data = struct.unpack('5s', country)
>>> unpack_data
    ('india',)
在上面的代码片段中,我在解包时提到了数据的长度(5s)。

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

长答:

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

然后在NUL字符上分割并取第一项,如下所示:

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))

split()中的, 1参数不是严格必需的,但它使其更有效,因为它只在第一次出现NUL时进行分割,而不是每次都进行分割。

还请注意,当packunpack的目标是读/写文件或与不同的系统交换数据时,重要的是在格式字符串之前显式地使用"<"或">"(或在某些非常特殊的情况下"="),无论是打包还是解打包,因为否则它将对齐和填充结构,这在很大程度上依赖于系统,并且可能导致难以发现错误。

相关内容

  • 没有找到相关文章

最新更新