Python struct.pack и распаковка

#python #struct #binary #byte #endianness

#python #структура #двоичный #байт #порядковый номер

Вопрос:

Я никоим образом не являюсь опытным программистом на python, поэтому я считаю, что на это может быть очевидный ответ, но я просто не могу разобраться в struct.pack и распаковать. у меня есть следующий код:

struct.pack("<" "I"*elements, *self.buf[:elements])

Я хочу отменить упаковку этого, однако я не уверен, как это сделать, я знаю, что «<» означает маленький конец, а «I» — это unsigned int, и это все, я не уверен, как использовать struct.unpack для обратной упаковки.

Комментарии:

1. Если вы хотите изменить упаковку, почему бы вам просто не упаковать элементы в первую очередь?

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

Ответ №1:

struct.pack принимает небайтовые значения (например, целые числа, строки и т.д.) и преобразует их в . bytes И наоборот, struct.unpack принимает bytes и преобразует их в их эквиваленты «более высокого порядка».

Например:

 >>> from struct import pack, unpack
>>> packed = pack('hhl', 1, 2, 3)
>>> packed
b'x00x01x00x02x00x00x00x03'
>>> unpacked = unpack('hhl', packed)
>>> unpacked
(1, 2, 3)
  

Итак, в вашем экземпляре у вас есть целые числа без знака с малым порядком окончания ( elements многие из них). Вы можете распаковать их, используя ту же строку структуры ( '<' 'I' * elements часть) — например struct.unpack('<' 'I' * elements, value) .

Пример из: https://docs.python.org/3/library/struct.html

Комментарии:

1. как можно вычислить элементы, не зная их =

2. @EmilB, если вы не знаете, как упаковываются двоичные данные, невозможно определить типы данных, используемые для их кодирования. Подумайте, если бы я дал вам какие-либо произвольные байты, у вас не было бы возможности узнать, какие данные это кодирует. В вашем случае, поскольку вы являетесь как отправителем, так и получателем, это не проблема. Но в целом кодирование в байты (без какой-либо согласованной структуры) трудно «отменить».

Ответ №2:

Просматриваем документацию: https://docs.python.org/3/library/struct.html

 obj = struct.pack("<" "I"*elements, *self.buf[:elements])
struct.unpack("<" "I"*elements, obj)
  

Это работает для вас?