#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)
идеально разделяется по размеру упаковки этого элемента.