Cómo convertir de hexadecimal a ASCII de los caracteres en la shell de Linux?

Digamos que tengo una cadena de 5a.

Esta es la representación hexadecimal de los ASCII de la letra Z.

Necesito saber una shell de Linux comando que se tome una cadena hexadecimal y salida ASCII de los caracteres que la cadena representa.

Así que si tengo que hacer:

echo 5a | command_im_looking_for

Voy a ver a una solitaria carta Z:

Z

12 Kommentare

  1. 59
    echo -n 5a | perl -pe 's/([0-9a-f]{2})/chr hex $1/gie'

    Tenga en cuenta que esto no salte no caracteres hexadecimales. Si usted quiere el hex (sin espacios en blanco de la cadena original, etc):

    echo 5a | perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie'

    También, zsh y bash soporte de esta forma nativa en echo:

    echo -e '\x5a'
    • Usted probablemente necesita para poner una «i» después de las expresiones regulares no.
    • Huy, gracias 🙂
    • O colocar un-fA-F en la clase de caracteres.
    • No soy normalmente un fan de perl, pero este es el tipo de cosas que hace bien. Si usted va a ser la conversión de una cantidad muy grande de datos, sin embargo, sería mejor escribir un pequeño programa en C para hacer esto.
    • Yo no creo que se vea mucho beneficio de hacerlo en C hasta que usted tiene que tratar con terabytes de datos.
    • procesa alrededor de 1,5 MB/s (salida) de aquí, así que realmente, en el momento de llegar a cientos de megabytes, es hora de escribir algo en un idioma más rápido 🙂
    • Mucho más fácil de usar perl -lne 'print pack "H*", $_'.
    • es más fácil para mí hacer uso de este porque no necesito perldoc -f pack cada vez 😉 por supuesto, YMMV…
    • echo -ne '\x5a' es necesario, dado el ejemplo: sin el modificador-n de echo, una nueva línea (‘\x0a») será la salida después de la a a la Z.
    • como una nota al margen de lo que @antik dijo, uno podría probar si todo es correcto a través de echo -ne '\x5a\xde\x0b\x0d' | xxd
    • Tuve una enorme cadena hex generado a partir de un mysqldump hex-blob guarda en una variable. He utilizado una forma modificada de la anterior a la salida el archivo original. He utilizado echo -e "$(echo $hex | sed 's_\(..\)_\\x\1_g')". Acabo de ver el próximo post con xxd. echo $hex | xxd -r -p trabajó como un encanto.

  2. 84

    Yo solía hacer esto utilizando xxd

    echo -n 5a | xxd -r -p

    Pero luego me di cuenta de que en Debian/Ubuntu, xxd es parte de vim-common y por lo tanto no puede estar presente en un sistema mínimo. Para evitar también perl (en mi humilde opinión, tampoco es parte de un sistema mínimo) que terminó con sed, xargs y printf como este:

    echo -n 5a | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf

    Su mayoría solo quiero convertir un par de bytes y está bien para esas tareas. La ventaja de esta solución a través de uno de ghostdog74 es que esto se puede convertir de hexadecimal cadenas de longitudes arbitrarias automáticamente. xargs se utiliza porque printf no leer de la entrada estándar.

    • o directamente : printf ‘\x5a’
    • ¿qué aspecto de mi respuesta a su comentario supone que la dirección?
    • Maldita sea, sé que es 3 años más tarde en el orignial respuesta, pero yo no tenía ni idea de xxd existido. Con el problema que estoy teniendo ahora, tengo una continua necesidad por ella… constante hexadecimal vertederos de cadenas de bytes de un depurador. Y sí, @Vouze comentario es maldito inútil.
    • Desde la página man de xxd : «Las herramientas rareza coincide con sus creadores cerebro». Así xxd no es un estándar de la shell de la herramienta y parece mantenido desde 1997, no se recomienda el uso de la misma. Pero ¿por qué no utilizar: a=5a; printf ‘\x’$a que es más sencillo que la sed de expresión.
    • tal vez usted no entiende la pregunta original o mi respuesta. La pregunta original askes para «tomar una cadena hexadecimal de salida y la de bytes binarios de la cadena representa». Su método funciona bien para los CARACTERES hexadecimales, pero no para las CADENAS. Si desea convertir más de un personaje que pronto te cansas de adornar cada representación hexadecimal con un \x. El comando sed automatiza que para usted. Aparte de eso, el comando sed hace exactamente lo que usted propone – sólo automatizado para cualquier cantidad de caracteres de entrada como a la pregunta original, pidió.
    • En lugar de "echo -n 5a | xxd -r -p" prefiero usar "xxd -r -p <<< 5a". Ventajas: (1) menos un par de caracteres a escribir (escribir también más rápido debido a 3x repetición); (2) sólo se ejecuta un comando (guarda el echo), no dos => una ejecución más rápida.
    • 1: error de Sintaxis: la redirección inesperado desventaja: no POSIX
    • Lo siento, debería haber mencionado las necesidades de Bash para trabajar. Es un here string en Bash (que es un concepto similar a la de un here document).
    • xxd -r no está disponible en busybox, pero el segundo está muy bien. gracias

  3. 13

    Se puede hacer a través de echo, solo y sin las otras cosas. No te olvides de añadir «-n» o se obtendrá un salto de línea automáticamente:

    echo -n -e "\x5a"
    • No responder a la pregunta planteada anteriormente, pero responde a la pregunta que yo estaba buscando cuando google me envía aquí 🙂 (por cierto. el envío de la salida a | hexdump -C ayuda a identificar los saltos de línea no deseados, etc.)
    • agradable, sin embargo, se requiere de BAsh
  4. 9

    Bash la línea

    echo -n "5a" | while read -N2 code; do printf "\x$code"; done
    • Esto no parece funcionar para multi-byte mensajes… Cuando ejecuto echo -n "0102abcd" | while read -n 2 code; do printf "\x$code"; done | hexdump rendimientos 0201 cdab
    • De acero parece hexdump muestra datos numéricos palabras en hexadecimal por defecto. Pruebe este echo -n "0102abcd" | while read -n 2 code; do printf "\x$code"; done | hexdump -e '/1 "%02x"'
  5. 3

    dependiendo de donde tienes que «5a’, sólo puede anexar \x a y pasar a printf

    $ a=5a
    $ a="\x${a}"
    $ printf "$a"
    Z
    • La segunda y tercera líneas se pueden resumir en uno: printf "\x${a}"
  6. 3

    Algunos python3 uno-trazadores de líneas que funcionan con cualquier número de bytes.

    Decodificación hexagonal (con strip, por lo que es aceptable tener un salto de línea en la entrada estándar stdin):

    $ echo 666f6f0a | python3 -c "import sys, binascii; sys.stdout.buffer.write(binascii.unhexlify(input().strip()))"
    foo

    Codificación hex:

    $ echo foo | python3 -c "import sys, binascii; print(binascii.hexlify(sys.stdin.buffer.read()).decode())"
    666f6f0a
    • Sólo el uso de la impresión a la hora de descodificar hexagonal y se puede ver ctrl caracteres, caracteres null, e.t.c.. por ejemplo, ‘echo 666f6f0a62617200 | python3 -c «import sys, binascii; print(binascii.unhexlify(input()))»‘ RESULTADO: ‘b’foo\nbar\x00»
  7. 2

    Aquí es un puro script de bash (como printf es una fiesta builtin) :

    #warning : spaces do matter
    die(){ echo "[email protected]" >&2;exit 1;}
    
    p=48656c6c6f0a
    
    test $((${#p} & 1)) == 0 || die "length is odd"
    p2=''; for ((i=0; i<${#p}; i+=2));do p2=$p2\\x${p:$i:2};done
    printf "$p2"

    Si bash ya se está ejecutando, este debe ser más rápido que cualquier otra solución que está lanzando un nuevo proceso.

    • ligeramente más corto: for ((i=0; i<${#p}; i+=2));do p2+=\\x${p:$i:2};done
  8. 1
    echo 5a | python -c "import sys; print chr(int(sys.stdin.read(),base=16))"
    • Cambiar el print a sys.stdout.write para evitar el extra carácter de avance de línea.
  9. 0

    GNU awk 4.1

    awk -niord '$0=chr("0x"RT)' RS=.. ORS=

    Tenga en cuenta que si echo a esto se producirá un extra de byte nulo

    $ echo 595a | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1c
    0000000  59  5a  00
              Y   Z  \0

    Lugar de utilizar printf

    $ printf 595a | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1c
    0000000  59  5a
              Y   Z

    También tenga en cuenta que GNU awk produce UTF-8 por defecto

    $ printf a1 | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1
    0000000 c2 a1

    Si usted está tratando con personajes fuera de ASCII, y usted va a ser
    La codificación Base64, la cadena resultante, puede desactivar la codificación UTF-8 con -b

    echo 5a | sha256sum | awk -bniord 'RT~/\w/,$0=chr("0x"RT)' RS=.. ORS=
  10. 0

    Como por @Randal comentario, puede utilizar perl, por ejemplo,

    $ printf 5a5a5a5a | perl -lne 'print pack "H*", $_'
    ZZZZ

    y de otra forma:

    $ printf ZZZZ | perl -lne 'print unpack "H*", $_'
    5a5a5a5a

    Otro ejemplo con archivo:

    $ printf 5a5a5a5a | perl -lne 'print pack "H*", $_' > file.bin
    $ perl -lne 'print unpack "H*", $_' < file.bin
    5a5a5a5a

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea