Что означают буквы в выводе struct.pack?

когда я меняю число на шестнадцатеричное в структурном модуле python,

>>> import struct
>>> struct.pack("i",89)
'Y\x00\x00\x00'
>>> struct.pack("i",890)
'z\x03\x00\x00'
>>> struct.pack("i",1890)
'b\x07\x00\x00'

что означает «Y, z, b» на выходе?


person Dd Pp    schedule 03.09.2012    source источник


Ответы (3)


Вы не конвертируете в шестнадцатеричный формат. Вы упаковываете целое число как двоичные данные... в данном случае двоичные данные с прямым порядком байтов. Первые символы — это просто соответствующие символы ASCII необработанным байтам; например 89 — это Y, 122 — это z, а 98 — это b.

  • Первый pack производит '\x59\x00\x00\x00' для 0x00000059; '\x59' это 'Y'.
  • Второй производит '\x7a\x03\x00\x00' для 0x0000037a; '\x7a' это 'z'.
  • Третий производит '\x62\x07\x00\x00' для 0x00000762; '\x62' это 'b'.

См. приведенную ниже таблицу ASCII.


(источник: asciitable.com)

person obataku    schedule 03.09.2012

Обратите внимание, что вы не конвертируете в шестнадцатеричный формат, вы конвертируете данные в необработанные байты. Затем консоль возвращает вам эти байты в форме, которую можно снова ввести в виде литеральных строк Python.

Таким образом, python печатает литеральную строку байтов, и некоторые байты могут быть представлены как символы ASCII; большинство байтов в диапазоне 0x21-0x7E могут быть напечатаны как таковые:

>>> '\x22'
'"'
>>> '\x50'
'P'

Таким образом, «Y», «z» и «b» — это байты, которые попадают в этот диапазон, и python просто печатает их как ASCII вместо экранирования \x:

>>> '\x59'
'Y'
>>> '\x62'
'b'
>>> '\x7a'
'z'

Остальные ваши байты выходят за пределы печатного диапазона ASCII, поэтому python представляет их как литералы \xFF, в которых используется шестнадцатеричная нотация.

person Martijn Pieters    schedule 03.09.2012

давайте построчно
но сначала мы должны понять формат с прямым порядком байтов и значение char:
32-битный прямой порядок байтов int имеет самые значащие биты справа
поэтому значение шестнадцатеричного значения в памяти (0x01, 0x02, 0x03, 0x04) действительно (0x04, 0x03, 0x02, 0x01)
char value 'Y' = 0x59 = 89, 'z' = 0x7a = 122, «б» = 0x62 = 98

'Y\x00\x00\x00' = 0x59, 0x00, 0x00, 0x00 /данные в памяти
'Y\x00\x00\x00' = 0x00000059 = 89 /действительное целочисленное значение

'z\x03\x00\x00' = 0x7a, 0x03, 0x00, 0x00 /данные в памяти
'z\x03\x00\x00' = 0x0000037a = 890 /действительное целочисленное значение

'b\x0b\x07\x00' = 0x62, 0x07, 0x00, 0x00 /данные в памяти
'b\x0b\x07\x00' = 0x00000762 = 1890 /действительное целочисленное значение

person Izack    schedule 03.09.2012