#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)
.
Комментарии:
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)
Это работает для вас?