#python #python-3.x #struct #unpack
#python #python-3.x #структура #распаковать
Вопрос:
извините, потому что мой английский не очень хорош.
Я пытаюсь декодировать двоичные сообщения somme с помощью unpack в python. но у меня проблема
первое сообщение выглядит так
from struct import *
firstMessage = b'x00x00x00x00xffxffxffx00' #without tags
decodeFirstMessage = unpack('1q',firstMessage)
print(decodeFirstMessage[0])
второе сообщение выглядит так
from struct import *
secondMessage = b'*xxyyzz x03 x00x00x00x00xffxffxffx00 tago1;' #with tags
decodeSecondMessage = unpack('7s1s1B1sq1s6s',firstMessage)
print(decodeSecondMessage [0])
для первого кода, который я получаю :
72057589742960640
в качестве ответа.
для второго кода я получаю:
для распаковки требуется буфер в 31 байт
в качестве ответа.
я попытался проверить значение format в функции unpack с помощью этого кода
print(calcsize('1q'))
print(calcsize('7s1s1B1sq1s6s'))
я получаю:
8
и
31
Я сам вычислил байты и получил
8
и
25
когда я меняю q на b или h в «формат», я получаю правильное значение 18 байт или 19 байт с помощью calcsize()
но для l и q у меня проблема
что не так в моей функции или как это можно решить, пожалуйста?
Ответ №1:
Причиной этого является заполнение.
Прочитайте весь раздел документа Порядок байтов, размер и выравнивание
Пример:
>>> print(calcsize('1s1q'))
16
>>> print(calcsize('=1s1q'))
9
Ответ №2:
Короткая версия такова: вместо этого используйте это для форматирования:
"=7s1s1B1s1q1s6s"
Более длинная версия — выравнивание. При использовании @
значения по умолчанию «родной» для «порядка байтов», «Размера» и «выравнивания». Формат интерпретируется в соответствии с тем, каким будет расположение соответствующего C struct
на платформе. Использование =
формата переключается на стандартные размеры и повороты выравнивания.