Использование пакета Python с массивами

Я пытаюсь использовать функцию pack в модуле struct для кодирования данных в форматы, требуемые сетевым протоколом. Я столкнулся с проблемой, заключающейся в том, что я не вижу способа кодировать массивы чего-либо, кроме 8-битных символов.

Например, чтобы закодировать «TEST», я могу использовать спецификатор формата «4s». Но как закодировать массив или список 32-битных целых чисел или других нестроковых типов?

Вот конкретный пример. Предположим, у меня есть функция doEncode, которая принимает массив 32-битных значений. Для протокола требуется поле длиной 32 бита, за которым следует сам массив. Вот что я смог придумать до сих пор.

from array import *
from struct import *

def doEncode(arr):
    bin=pack('>i'+len(arr)*'I',len(arr), ???)

arr=array('I',[1,2,3])
doEncode(arr)

Лучшее, что мне удалось придумать, это динамическое создание формата строки пакета из длины массива. Есть ли способ указать, что у меня есть массив, поэтому мне не нужно этого делать, как со строкой (которая, например, будет pack('>i'+len(arr)+'s')?

Даже с описанным выше подходом я не уверен, как я буду передавать элементы в массиве аналогичным динамическим способом, т.е. я не могу просто сказать , arr[0], arr[1], ..., потому что я не знаю заранее, какая длина будет быть.

Я полагаю, я мог бы просто упаковать каждое отдельное целое число в массиве в цикле, а затем объединить все результаты вместе, но это похоже на хак. Есть ли лучший способ сделать это? Модули массива и структуры, кажется, делают свое дело, но в этом случае я пытаюсь сделать комбинацию обоих, чего ни один из них не хочет делать.


person Michael    schedule 14.01.2013    source источник


Ответы (1)


person    schedule
comment
А, спасибо. Должен ли я беспокоиться о части len(arr)*'I' для больших значений len(arr)? - person Michael; 14.01.2013