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".
¡Cuidado!
hexdump
y xxd
dan los resultados en endianness diferente!
$ echo -n $''/x12/x34'' | xxd -p
1234
$ echo -n $''/x12/x34'' | hexdump -e ''"%x"''
3412
http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef01543533e604970c-800wi : D
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