2008-09-25 7 views
12

¿Alguien puede explicar por qué cómo se calcula el resultado para el siguiente desempaquetado?¿Cómo funciona string.unpack en Ruby?

"aaa".unpack('h2H2')    #=> ["16", "61"] 

En binario, 'a' = 0110 0001. No estoy seguro de cómo el 'h2' puede llegar a ser 16 (0001 0000) o 'H2' puede llegar a ser 61 (0011 1101).

Respuesta

9

No 16 - muestra 1 y luego 6. h le da el valor hexadecimal de cada mordisco, por lo que obtiene 0110 (6), luego 0001 (1), dependiendo de si es el bit alto o bajo que ' Estoy mirando. Usa el nibble alto primero y obtienes 61, que es hexadecimal para 97 - el valor de 'a'

6

Consulte la programación de Ruby reference al desempaquetar. He aquí un fragmento:

Decodifica str (que puede contener datos binarios ) de acuerdo con la cadena de formato, devuelve una matriz de cada valor extraído. La cadena de formato consiste de una secuencia de un solo carácter directivas, que se resumen en la Tabla 22.8 en la página 379. Cada directiva puede ser seguido de un número, que indica el número de veces que repetir con esta Directiva. Un asterisco ("*") usará todos los elementos restantes. Las directivas sSiIlL se pueden seguir con un guion bajo ("_") para usar el tamaño nativo de la plataforma subyacente para el tipo especificado; de lo contrario, usa un tamaño consistente independiente de la plataforma. Los espacios se ignoran en el formato cadena. Ver también Matriz # paquete en la página 286.

Y los personajes relevantes de su ejemplo:

mordiscos H Extracto hexagonales de cada personaje (el más significativo primero).

h Extrae los nibbles hexadecimales de cada caracter (menos significativos primero).

2

El código hexadecimal de Char a es 61.

Plantilla h2 es una cadena hex (bajo nybble primero), H2 es la misma con alta nibble primero.

Ver también perl documentation.

Cuestiones relacionadas