2016-01-14 2 views
2

что у меня есть list или tuple, содержащее число типа long long,питона struct.pack(): пакет несколько ДАННЫХ в виде списка или кортеж

x = [12974658, 638364, 53637, 63738363] 

Если хочет, чтобы struct.pack их по отдельности, я должен использовать

struct.pack('<Q', 12974658) 

или, если я хочу, чтобы это сделать, как несколько, то я должен явно указать это так

struct.pack('<4Q', 12974658, 638364, 53637, 63738363) 

Но как я могу вставлять элементы в list или tuple внутри инструкции struct.pack. Я попытался использовать цикл for следующим образом.

struct.pack('<4Q', ','.join(i for i in x)) 

получил ошибку говоря expected string, int found, поэтому я преобразовал список, содержащий тип int в str, теперь он становится гораздо более сложным, чтобы упаковать их. Потому что весь список преобразуется в строку (например, одно предложение).

В настоящее время им делать некоторые вещи, как

binary_data = '' 
x = [12974658, 638364, 53637, 63738363] 
for i in x: 
    binary_data += struct.pack('<Q', i) 

И я распаковывать их, как

struct.unpack('<4Q', binary_data) 

Мой вопрос: есть лучший путь вокруг, как я могу прямо указать на list или tuple внутри заявления struct.pack, или, возможно, одного лайнера?

+0

Я также попробовал [этот SO ответ] (http://stackoverflow.com/questions/16368263/python-struct-pack-for-individual-elements-in-a-list). не помогло. Я получаю ошибку как «плохой символ в формате структуры». – arvindh

ответ

8

Вы можете splat, извини «распаковать список аргументов»:

>>> struct.pack("<4Q", *[1,2,3,4]) 
'\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00' 

Если длина списка является динамическим, вы, конечно, можете построить строку формата во время выполнения тоже:

>>> x = [1, 2] # This could be any list of integers, of course. 
>>> struct.pack("<%uQ" % len(x), *x) 
'\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00' 
+0

haa ... Я пытался использовать его как 'struct.pack (' arvindh

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

  • Нет связанных вопросов^_^