web-dev-qa-db-fra.com

Chaîne de conversion hexadécimale en ascii en ligne de commande bash

J'ai beaucoup de ce type de chaîne et je veux trouver une commande pour le convertir en ascii, j'ai essayé avec echo -e et od, mais cela n'a pas fonctionné.

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

Ce code convertira le texte 0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2 en un flux de 11 octets avec des valeurs équivalentes. Ces octets seront écrits en sortie standard.

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

Comme d'autres l'ont souligné, cela ne donnera pas une chaîne imprimable ASCII pour la simple raison que les octets spécifiés ne sont pas ASCII. Vous devez poster plus d'informations sur la façon dont vous avez obtenu cette chaîne pour que nous puissions vous aider.

Comment cela fonctionne: xxd -r convertit les données hexadécimales en données binaires (comme un vidage hexadécimal inversé). xxd exige que chaque ligne commence par le numéro d'index du premier caractère de la ligne (exécutez hexdump sur quelque chose et voyez comment chaque ligne commence par un numéro d'index). Dans notre cas, nous voulons que ce nombre soit toujours égal à zéro, car chaque exécution ne comporte qu'une seule ligne. Comme par hasard, nos données ont déjà des zéros avant chaque caractère faisant partie de la notation 0x. Le x minuscule étant ignoré par xxd, il suffit donc de diriger chaque caractère 0xhh vers xxd et de le laisser faire le travail.

Le tr traduit les points en espaces afin que for le scinde correctement.

16
Dan Bliss

Cela a fonctionné pour moi.

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

-r lui dit de convertir hex en ascii par opposition à son mode normal de faire le contraire

-p lui dit d'utiliser un format ordinaire.

88
funroll

Vous pouvez utiliser quelque chose comme ça.

$ cat test_file.txt
54 68 69 73 20 69 73 20 74 65 78 74 20 64 61 74 61 2e 0a 4f 6e 65 20 6d 6f 72 65 20 6c 69 6e 65 20 6f 66 20 74 65 73 74 20 64 61 74 61 2e

$ for c in `cat test_file.txt`; do printf "\x$c"; done;
This is text data.
One more line of test data.
3
Raghu Sodha

Le echo -e a dû échouer pour vous à cause d'une erreur d'échappement . Le code suivant fonctionne très bien pour moi sur une sortie similaire à partir de your_program with arguments:

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

Veuillez noter cependant que votre chaîne hexagonale originale est composée de caractères non imprimables.

1
Alexander Amelkin

Les valeurs que vous avez fournies sont des valeurs UTF-8. Lorsqu'il est défini, le tableau de:

declare -a ARR=(0xA7 0x9B 0x46 0x8D 0x1E 0x52 0xA7 0x9B 0x7B 0x31 0xD2)

Sera analysé pour imprimer les caractères en clair de chaque valeur.

for ((n=0; n < ${#ARR[*]}; n++)); do echo -e "\u${ARR[$n]//0x/}"; done

Et la sortie donnera quelques caractères imprimables et des caractères non imprimables, comme indiqué ici:

 enter image description here

Pour convertir des valeurs hexadécimales en texte brut à l'aide de la commande echo:

echo -e "\x<hex value here>"

Et pour convertir les valeurs UTF-8 en texte brut à l’aide de la commande echo:

echo -e "\u<UTF-8 value here>"

Et ensuite, pour convertir octal en texte brut à l’aide de la commande echo:

echo -e "\0<octal value here>"

Lorsque vous avez des valeurs de codage que vous ne connaissez pas, prenez le temps de vérifier les plages des schémas de codage courants afin de déterminer le codage auquel une valeur appartient. Ensuite, la conversion à partir de là est un jeu d'enfant.

0
Yokai