У меня проблема с функцией распаковки в python

#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 на платформе. Использование = формата переключается на стандартные размеры и повороты выравнивания.