0

当我将数据打包为固定长度然后在解包时我无法在不提及数据实际长度的情况下检索数据。

如何只检索没有 \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)。

4

1 回答 1

0

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

更长的答案:

更间接的解决方案实际上并没有那么糟糕。解包字符串时,使用与打包时相同的长度。这将返回包含 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))

, 1参数 in不是绝对必要的split(),但它更有效,因为它只在第一次出现 NUL 时分裂,而不是每一次出现。

另请注意,当packing 和unpacking 以读取/写入文件或与不同系统交换数据为目标时,重要的是在格式字符串之前明确地使用“<”或“>”(或在某些非常特殊的情况下为“=”),用于打包和解包,否则它将对齐和填充结构,这严重依赖于系统,并且可能导致以后很难找到错误。

于 2013-06-10T12:52:58.560 回答