распаковка структуры python

#python #perl #struct #unpack

#питон #perl — язык программирования #структура #распаковывать #python #perl #распаковка

Вопрос:

Я пытаюсь преобразовать следующий код perl:

 unpack(.., "Z*")
  

однако для python отсутствие модификатора формата «*» в struct.unpack(), похоже, делает это невозможным. Есть ли способ, которым я могу сделать это на python?

P.S. Модификатор «*» в perl из perldoc, предоставляющий * для подсчета повторений вместо числа, означает использовать, сколько бы элементов ни осталось, …

Таким образом, хотя python имеет числовое количество повторений, как и perl, ему, похоже, не хватает * repeat count .

Ответ №1:

у python struct.unpack нет Z формата

 Z  A null-terminated (ASCIZ) string, will be null padded.
  

я думаю, что это

 unpack(.., "Z*")
  

было бы:

 data.split('x00')
  

хотя это удаляет нули

Ответ №2:

Я предполагаю, что вы создаете тип данных struct и знаете размер структуры. Если это так, то вы можете создать буфер, выделенный для этой структуры, и упаковать значение в буфер. Во время распаковки вы можете использовать тот же буфер для непосредственной распаковки, просто указав начальную точку.

Например, для

 import ctypes
import struct
s = struct.Struct('I')
b = ctypes.create_string_buffer(s.size)
s.pack_into(b, 0, 42)
s.unpack_from(b, 0)
  

Комментарии:

1. К сожалению, тип данных struct был создан не мной, но я смог перепроектировать некоторые из его полей.

Ответ №3:

Вы должны самостоятельно рассчитать количество повторений:

 n = len(s) / struct.calcsize(your_fmt_string)
f = '%d%s' % (n, your_fmt_string)
data = struct.unpack(s, f)
  

Я предполагаю, что your_fmt_string не распаковывает более одного элемента и len(s) идеально разделяется по размеру упаковки этого элемента.