Я пытаюсь использовать функцию 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], ...
, потому что я не знаю заранее, какая длина будет быть.
Я полагаю, я мог бы просто упаковать каждое отдельное целое число в массиве в цикле, а затем объединить все результаты вместе, но это похоже на хак. Есть ли лучший способ сделать это? Модули массива и структуры, кажется, делают свое дело, но в этом случае я пытаюсь сделать комбинацию обоих, чего ни один из них не хочет делать.