linux scripting hexdump

linux - convertir datos binarios a hex en script de shell?



hexdump linux (8)

Tal vez podrías escribir tu propia pequeña herramienta en C y compilarla sobre la marcha:

int main (void) { unsigned char data[1024]; size_t numread, i; while ((numread = read(0, data, 1024)) > 0) { for (i = 0; i < numread; i++) { printf("%02x ", data[i]); } } return 0; }

Y luego alimentarlo desde la entrada estándar:

cat /bin/ls | ./a.out

Incluso puede insertar este pequeño programa C en un script de shell usando la sintaxis heredoc.

se siente un poco estúpido al preguntar esto (suena como lo básico) pero no puede encontrar una respuesta en otro lado. Quiero convertir datos binarios a hexadecimal, solo eso, no hay formateo sofisticado y todo. hexdump parece demasiado inteligente, me "sobreformatea". Quiero tomar x bytes de / dev / random y pasarlos como hex.

Preferiblemente, me gustaría usar solo herramientas estándar de Linux, para que no tenga que instalarlo en todas las máquinas (hay muchas)


Tal vez use xxd :

% xxd -l 16 -p /dev/random 193f6c54814f0576bc27d51ab39081dc


dd + hexdump también funcionará:

dd bs=1 count=1 if=/dev/urandom 2>/dev/null | hexdump -e ''"%x"''


Con od (sistemas GNU):

$ echo abc | od -A n -v -t x1 | tr -d '' /n'' 6162630a

Con hexdump (sistemas BSD):

$ echo abc | hexdump -ve ''/1 "%02x"'' 6162630a

De http://en.wikipedia.org/wiki/Hex_dump#od_and_hexdump :
"Dependiendo del tipo de sistema, una o ambas de estas dos utilidades estarán disponibles: los sistemas BSD deprecian od para hexdump, los sistemas GNU lo contrario".



Si necesita una secuencia grande (sin líneas nuevas), puede usar tr y xxd (parte de vim) para la conversión de byte a byte.

head -c1024 /dev/urandom | xxd -p | tr -d $''/n''

O puede usar hexdump (posix) para la conversión palabra por palabra.

head -c1024 /dev/urandom | hexdump ''-e"%x"''

Tenga en cuenta que la diferencia es endianness.


Estos tres comandos imprimirán lo mismo (0102030405060708090a0b0c):

n=12 echo "$a" | xxd -l "$n" -p echo "$a" | od -N "$n" -An -tx1 | tr -d " /n" ; echo echo "$a" | hexdump -n "$n" -e ''/1 "%02x"''; echo

Dado que n=12 y $a son los valores de bytes de 1 a 26:

a="$(printf ''%b'' "$(printf ''//0%o'' {1..26})")"

Eso podría usarse para obtener valores de bytes aleatorios en cada programa:

xxd -l "$n" -p /dev/urandom od -vN "$n" -An -tx1 /dev/urandom | tr -d " /n" ; echo hexdump -vn "$n" -e ''/1 "%02x"'' /dev/urandom ; echo


Todas las soluciones parecen ser difíciles de recordar o demasiado complejas, y el uso de printf el más corto:

$ printf ''%x/n'' 256 100

[editar]

Pero como se señala en los comentarios, esto no es lo que el autor quiere, por lo que para ser justos a continuación es una respuesta completa.

... para usar arriba para dar salida a la corriente de datos binarios reales:

printf ''%x/n'' $(cat /dev/urandom | head -c 5 | od -An -vtu1)

Que hace:

  • printf ''% x / n'' .... - imprime una secuencia de enteros, es decir. printf ''%x,'' 1 2 3 , imprimirá 1,2,3,
  • $ (...) - esta es una manera de obtener salida de algún comando de shell y procesarlo
  • cat /dev/urandom - genera datos binarios aleatorios
  • head -c 5 - limita los datos binarios a 5 bytes
  • od -An -vtu1 - comando de volcado octal, convierte binario a decimal

como un caso de prueba (''a'' es 61 hex, ''p'' es 70 hex, ...):

$ printf ''%x/n'' $(echo "apple" | head -c 5 | od -An -vtu1) 61 70 70 6c 65

o para probar bytes binarios individuales, en la entrada permite dar 61 decimales (''='' char) para producir datos binarios (lo hace el formato ''//x%x'' ), el comando anterior dará como resultado 3d (decimal 61):

$printf ''%x/n'' $(echo -ne "$(printf ''//x%x'' 61)" | head -c 5 | od -An -vtu1) 3d