当我将数据打包到固定长度然后在解压缩时,我无法检索数据而没有提到数据的实际长度。
如何在不计算之前的长度的情况下,仅检索没有\ 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)。
答案 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而不是每一次出现时分割。
另请注意,当pack
和unpack
目标读取/写入文件或与不同系统交换数据时,务必在格式字符串前面加上“<”或“>” (或在某些非常特殊的情况下为“=”),包装和拆包都是如此,否则会对齐和填充结构,这在很大程度上取决于系统,可能导致以后很难发现错误。