когда я меняю число на шестнадцатеричное в структурном модуле 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» на выходе?
когда я меняю число на шестнадцатеричное в структурном модуле 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» на выходе?
Вы не конвертируете в шестнадцатеричный формат. Вы упаковываете целое число как двоичные данные... в данном случае двоичные данные с прямым порядком байтов. Первые символы — это просто соответствующие символы 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 а>)
Обратите внимание, что вы не конвертируете в шестнадцатеричный формат, вы конвертируете данные в необработанные байты. Затем консоль возвращает вам эти байты в форме, которую можно снова ввести в виде литеральных строк Python.
Таким образом, python печатает литеральную строку байтов, и некоторые байты могут быть представлены как символы ASCII; большинство байтов в диапазоне 0x21-0x7E могут быть напечатаны как таковые:
>>> '\x22'
'"'
>>> '\x50'
'P'
Таким образом, «Y», «z» и «b» — это байты, которые попадают в этот диапазон, и python просто печатает их как ASCII вместо экранирования \x
:
>>> '\x59'
'Y'
>>> '\x62'
'b'
>>> '\x7a'
'z'
Остальные ваши байты выходят за пределы печатного диапазона ASCII, поэтому python представляет их как литералы \xFF
, в которых используется шестнадцатеричная нотация.
давайте построчно
но сначала мы должны понять формат с прямым порядком байтов и значение 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 /действительное целочисленное значение