Понимание функций структурного пакета / распаковки Python

#struct #python-3.6

#структура #python-3.6

Вопрос:

Я работаю над проектом, который включает в себя использование struct модуля и его pack/unpack функций с python3.6

Я ссылался на многие статьи, подобные этой, и получил основную идею, но я не могу понять ее для своего варианта использования.

Например:

 var = struct.pack('i',1) 
print(var) 
  

Это дает вывод b'x01x00x00x00' , который я могу понять, потому что мы упомянули int как формат, и, следовательно, вывод имеет размер 4 байта.

Теперь еще один пример:

 var = struct.pack('i', 1156888062)
  

Теперь в этом случае почему вывод b'xfexb5xf4D' . Может кто-нибудь, пожалуйста, объяснить это.

Также, когда я его распаковываю

 print(struct.unpack('f', var))
  

Почему результат (1957.687255859375,)

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

1. Почему вы упаковываете его как целое число и распаковываете значение с плавающей точкой?

Ответ №1:

 >>> struct.pack('i', 1156888062)
b'xfexb5xf4D'
  

Это все еще четыре байта, просто один из этих байтов является печатным символом ASCII D , поэтому он отображается как это, а не как x44 . Это всего лишь другое представление. Доказательство:

 >>> len(b'xfexb5xf4D')
4
>>> b'x44'
b'D'
  

Для последнего бита вам нужно unpack использовать тот же спецификатор формата, который вы упаковали как. Вы просите интерпретировать те же четыре байта как число с плавающей запятой, поэтому, очевидно, это даст вам другой результат. Измените его на 'i' , и он будет работать так, как ожидалось:

 >>> struct.unpack('f', var)
(1957.687255859375,)
>>> struct.unpack('i', var)
(1156888062,)    
  

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

1. Я хочу, чтобы результат в формате float вот почему f используется.

2. Что именно вы подразумеваете под «я хочу результат в float»? Вы ищете 1156880862.0 ? Потому что одни и те же четыре байта интерпретируются как int или float будут означать совершенно разные вещи.