python struct unpack - PullRequest
       32

python struct unpack

1 голос
/ 01 мая 2011

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

unpack(.., "Z*")

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

P.S. Модификатор "*" в perl из perldoc - Предоставление * для числа повторов вместо числа означает использование сколько бы ни осталось элементов, ...

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

Ответы [ 3 ]

3 голосов
/ 01 мая 2011

Python's struct.unpack не имеет формата Z

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

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

unpack(.., "Z*")

будет:

data.split('\x00')

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

2 голосов
/ 01 мая 2011

Я предполагаю, что вы создаете тип данных 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)
0 голосов
/ 01 мая 2011

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

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

...