¿Cuál es el significado de las letras en la salida de struct.pack?

cuando cambio el número en hexadecimal en el módulo struct de 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' 

¿Cuál es el significado de “Y, z, b” en la salida?

No estás convirtiendo a hex. Está empaquetando el número entero como datos binarios … en este caso, datos binarios little-endian. Los primeros caracteres son solo los caracteres ASCII correspondientes a los bytes en bruto; por ejemplo, 89 es Y , 122 es z , y 98 es b .

  • El primer pack produce '\x59\x00\x00\x00' para 0x00000059 ; '\x59' es 'Y' .
  • El segundo produce '\x7a\x03\x00\x00' para 0x0000037a ; '\x7a' es 'z' .
  • El tercero produce '\x62\x07\x00\x00' para 0x00000762 ; '\x62' es 'b' .

Vea la siguiente tabla ASCII.

http://sofes.miximages.com/pack/asciifull.gif

Tenga en cuenta que no está convirtiendo a hexadecimal, está convirtiendo datos a bytes en bruto. La consola le está devolviendo esos bytes a usted, en una forma que puede ingresarse nuevamente como cadenas literales de python.

Así que python está imprimiendo la cadena de bytes literal , y algunos de los bytes se pueden representar como caracteres ASCII; la mayoría de los bytes en el rango 0x21-0x7E se pueden imprimir como tales:

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

Por lo tanto, ‘Y’, ‘z’ y ‘b’ son bytes que caen en ese rango y python simplemente los imprime como ASCII en lugar de \x escapes:

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

El rest de sus bytes se encuentran fuera del rango ASCII imprimible, por lo que Python los representa como literales \xFF , que usan la notación hexadecimal.

vamos línea por linea
pero primero tenemos que entender el formato little-endian y el valor char:
32 bit little-endian int tienen los bits más significativos a la derecha
entonces el valor del hexadecimal en memoria (0x01, 0x02, 0x03, 0x04) es realmente (0x04, 0x03, 0x02, 0x01)
valor char ‘Y’ = 0x59 = 89, ‘z’ = 0x7a = 122, ‘b’ = 0x62 = 98

‘Y \ x00 \ x00 \ x00’ = 0x59, 0x00, 0x00, 0x00 / Datos en la memoria
‘Y \ x00 \ x00 \ x00’ = 0x00000059 = 89 / Valor entero real

‘z \ x03 \ x00 \ x00’ = 0x7a, 0x03, 0x00, 0x00 / Datos en la memoria
‘z \ x03 \ x00 \ x00’ = 0x0000037a = 890 / valor entero real

‘b \ x0b \ x07 \ x00’ = 0x62, 0x07, 0x00, 0x00 / Datos en la memoria
‘b \ x0b \ x07 \ x00’ = 0x00000762 = 1890 / valor entero real