2013-06-10 3 views
0

Когда я упаковываю данные на фиксированную длину, а затем при распаковке я не могу извлечь данные без упоминания фактической длины данных.Распаковка данных в python в библиотеке struct

Как получить только данные без символов \ 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',) 

В приведенном выше фрагменте кода я упомянул длину данных (5 с) при распаковке.

ответ

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 в split() не является строго необходимым, но и делает его более эффективным, так как он расщепляет только на первый появление NUL вместо каждого.

отметить также, что при pack ИНГ и unpack ИНГ с целью чтения/файлы записи или обмениваться данными с различными системами, очень важно, чтобы явно предшествуют свои форматные строки с «<» или «>» (или «=» в некоторые очень специальные случаи), как для упаковки, так и для распаковки, поскольку в противном случае он будет выравнивать и размещать структуры, которые сильно зависят от системы и могут впоследствии затруднить обнаружение ошибок.

Смежные вопросы