Conversión cadena hexadecimal a ascii en línea de comandos bash

Tengo un montón de este tipo de cadena y quiero encontrar un comando para convertirlo en ascii, he intentado con echo -e y od, pero no funcionó.

0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2

Esto funcionó para mí.

$ echo 54657374696e672031203220330 | xxd -r -p
Testing 1 2 3$

-r le dice que convierta hex a ascii a diferencia de su modo normal de hacer lo contrario

-p le dice que use un formato plano.

Comentarios (1)
Solución

Este código convertirá el texto 0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2 en un flujo de 11 bytes con valores equivalentes. Estos bytes se escribirán en la salida estándar.

TESTDATA=$(echo '0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2' | tr '.' ' ')
for c in $TESTDATA; do
    echo $c | xxd -r
done

Como otros han señalado, esto no resultará en una cadena ASCII imprimible por la sencilla razón de que los bytes especificados no son ASCII. Usted necesita publicar más información acerca de cómo obtuvo esta cadena para que podamos ayudarle con eso.

Cómo funciona: xxd -r traduce datos hexadecimales a binarios (como un hexdump inverso). xxd requiere que cada línea comience con el número de índice del primer carácter de la línea (ejecute hexdump en algo y vea cómo cada línea comienza con un número de índice). En nuestro caso queremos que ese número sea siempre cero, ya que cada ejecución sólo tiene una línea. Por suerte, nuestros datos ya tienen ceros antes de cada carácter como parte de la notación 0x. La x minúscula es ignorada por xxd, así que todo lo que tenemos que hacer es canalizar cada carácter 0xhh a xxd y dejar que haga el trabajo.

El tr traduce los puntos a espacios para que for los divida correctamente.

Comentarios (5)

El echo -e debe haber fallado en tu caso debido a un escape incorrecto. El siguiente código funciona bien para mí en una salida similar de su_programa con argumentos:

echo -e $(your_program with arguments | sed -e 's/0x\(..\)\.\?/\\x\1/g')

Ten en cuenta, sin embargo, que tu cadena hexadecimal original contiene caracteres no imprimibles.

Comentarios (0)