Conversion chaîne hexadécimale en ascii en ligne de commande bash
J'ai un lot de ce genre de chaîne et je veux trouver une commande pour le convertir en ascii, j'ai essayé avec echo -e
et od
, mais il n'a pas de travail.
0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2
5 réponses
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 sera écrit 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 n'entraînera pas une chaîne ASCII imprimable pour la simple raison que les octets spécifiés ne sont pas ASCII. Vous avez besoin de poster plus d'informations sur la façon dont vous avez obtenu cette chaîne pour que nous puissions vous aider avec cela.
Comment ça marche: xxd-R traduit les données hexadécimales en binaire (comme un hexdump inverse). xxd nécessite que chaque ligne commence avec le numéro d'index du premier caractère sur la ligne (exécutez hexdump sur quelque chose et voyez comment chaque ligne commence avec un numéro d'index). Dans notre cas, nous voulons que ce nombre soit toujours nul, puisque chaque exécution n'a qu'une seule ligne. Par chance, nos données ont déjà des zéros avant chaque caractère dans le cadre de la notation 0x. Le x minuscule est ignoré par xxd, donc tout ce que nous avons à faire est de diriger chaque caractère 0xhh vers xxd et de le laisser faire le travail.
Le tr traduit les périodes en espaces afin que for le divise correctement.
Cela a fonctionné pour moi.
$ echo 54657374696e672031203220330 | xxd -r -p
Testing 1 2 3$
-r
Il lui dit de convertir hex en ascii par opposition à son mode normal de faire le contraire
-p
lui dit d'utiliser un format simple.
Vous pouvez utiliser quelque chose comme ceci.
$ 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.
Le {[1] } a dû échouer pour vous à cause d'une mauvaise évasion.
Le code suivant fonctionne bien pour moi sur une sortie similaire de your_program with arguments
:
echo -e $(your_program with arguments | sed -e 's/0x\(..\)\.\?/\\x\1/g')
Veuillez toutefois noter que votre hexstring original est constitué de caractères non imprimables.
Les valeurs que vous avez fournies sont des valeurs UTF-8. Lorsque 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 quelques caractères non imprimables comme indiqué ici:
Pour convertir des valeurs hexadécimales en texte clair à l'aide de la commande echo
:
echo -e "\x<hex value here>"
Et pour convertir les valeurs UTF-8 en texte clair à l'aide de la commande echo
:
echo -e "\u<UTF-8 value here>"
Et puis pour conversion d'octal en texte clair à l'aide de la commande echo
:
echo -e "\0<octal value here>"
Lorsque vous avez des valeurs d'encodage que vous n'êtes pas familier avec, prenez le temps de vérifier les plages dans les schémas d'encodage communs pour déterminer à quel encodage une valeur appartient. Ensuite, la conversion à partir de là est un jeu d'enfant.