当我将数据打包为固定长度时,然后在拆包时,我无法检索数据而不提及数据的实际长度。
如何只检索没有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时进行分割,而不是每次都进行分割。
还请注意,当pack
和unpack
的目标是读/写文件或与不同的系统交换数据时,重要的是在格式字符串之前显式地使用"<"或">"(或在某些非常特殊的情况下"="),无论是打包还是解打包,因为否则它将对齐和填充结构,这在很大程度上依赖于系统,并且可能导致难以发现错误。