
$ echo "hello" | od
0000000 062550 066154 005157
0000006
Sé que la primera columna representa el desplazamiento de bytes. Pero no veo cómo se forman los otros números. Según man
lo anterior debería ser "bytes octales". Sin embargo, se supone que la opción -b
"selecciona bytes octales" también e imprime algo diferente:
$echo "hello" | od -b
0000000 150 145 154 154 157 012
0000006
EDITAR: Por cierto, esto es lo que esperaría que apareciera, es decir, los valores ascii de todos los caracteres en 'hola\n' como lo que esperaría que se llamara "bytes octales".
Respuesta1
od
no muestra bytes de forma predeterminada, muestra palabras en octal. Puede que esto no sea del todo intuitivo, pero no olvides od
que es unamuycomando antiguo :-) Usaré un ejemplo algo más simple que el tuyo:
$ echo -en '\01\02' | od
0000000 001001
0000002
Como Intel utiliza unlittle-endianarquitectura, los bytes \01\02
se interpretan como 00000010 00000001
en binario.
Como los dígitos octales representan cada uno 3 bits, podemos agrupar ese número de esta manera:
(0)(000)(001)(000)(000)(001)
Entonces la representación octal de esos 2 bytes es:
001001
Para el uso diario esto es bastante inútil; quizás en el pasado era útil para depurar manualmente volcados de memoria :-)
Tu hello\n
ejemplo es:
h = 01101000
e = 01100101
l = 01101100
l = 01101100
o = 01101111
\n= 00001010
Ahora es un poco más complicado, porque los dígitos octales representan 3 bits, pero los bytes son 8 bits; entonces se agrega relleno :-( El resultado simbólicamente es:
PehPllP\no
Recuerde, cada conjunto de 2 bytes se intercambia debido al endianismo. ElPAGes un relleno de 2 bits. El resultado en octal es (usando una barra como separador):
00/01100101/01101000/00/01101100/01101100/00/00001010/01101111
Ahora en grupos octales de 3 bits:
000 110 010 101 101 000 000 110 110 001 101 100 000 000 101 001 101 111
Traducido a dígitos octales:
062550066154005157
Esto coincide con su resultado.
En conclusión, probablemente hayas aprendido que od
sin opciones es peor que inútil :-)