Как правильно упаковать персонажа и номер? - PullRequest
0 голосов
/ 23 марта 2019

Я изучаю взаимодействие клиент-сервер в Python и хочу отправить несколько упакованных структур. Я хочу упаковать математический знак и число. Я пытался так:

idx         = 50    
value1      = "<"
value2      = idx
packer      = struct.Struct('1s I')
packed_data = packer.pack(*value1, *value2)

Но я получил ошибку:

packed_data = packer.pack(*value1, *value2)
TypeError: 'int' object is not iterable

или эта ошибка:

packed_data = packer.pack(*value1, *value2)
struct.error: argument for 's' must be a bytes object

Если я попробую вот так:

    value2      = [idx]

Я не знаю, как это сделать правильно.

1 Ответ

0 голосов
/ 23 марта 2019

Первая проблема заключается в том, что вы без необходимости пытаетесь (последовательность) распаковать ваши аргументы.Формат Struct ожидает bytes и int, а у вас (почти) они уже есть.

Вторая проблема заключается в том, что "<" - это строка Unicode pack ожидает байты вместо этого.Сначала необходимо правильно кодировать строку.

packed_data = packer.pack(value1.encode('utf-8'), value2)

Конкретная кодировка, которую вы используете, не имеет значения, если вы используете ту же кодировку для распаковки данных.

Обратите внимание, что еслиу вас действительно есть символ Unicode, который не может быть закодирован одним байтом, ваш формат строки будет неправильным.Модуль struct не обрабатывает строки переменной длины сам по себе, поэтому, вероятно, было бы проще просто кодировать int сам по себе и объединить его с вашей закодированной строкой.

value = 
packed_data = value1.encode('utf-8') + struct.pack("I", value2)
...