web-dev-qa-db-fra.com

Ascii/Hex converti en bash

Je le fais maintenant de cette façon:

[root@~]# echo Aa|hexdump -v
0000000 6141 000a                              
0000003
[root@~]# echo -e "\x41\x41\x41\x41"
AAAA

Mais ça ne se comporte pas exactement comme je le voulais,

la forme hexadécimale de Aa devrait être 4161, mais la sortie est 6141 000a, ce qui semble ne pas avoir de sens.

et lors de l'exécution de hex en ascii, existe-t-il un autre utilitaire pour que je n'ai pas besoin du préfixe \x?

35
gdb

La raison en est que hexdump imprime par défaut les entiers 16 bits, pas les octets. Si votre système en possède, hd (ou hexdump -C) ou xxd fournira des sorties moins surprenantes. Sinon, od -t x1 est un moyen standard POSIX d'obtenir une sortie hexadécimale. Vous pouvez utiliser od -t x1c pour afficher les valeurs hexadécimales d'octets et les lettres correspondantes.

Si vous avez xxd (fourni avec vim), vous pouvez utiliser xxd -r pour reconvertir à partir d'hex (à partir du même format que xxd produit). Si vous avez simplement un hexagone simple (juste le '4161', qui est produit par xxd -p), vous pouvez utiliser xxd -r -p pour reconvertir.

49
Random832

Pour la première partie, essayez

echo Aa | od -t x1

Il imprime octet par octet

$ echo Aa | od -t x1
0000000 41 61 0a
0000003

0a est le retour à la ligne implicite produit par écho.

Utilisez echo -n ou printf à la place.

$ printf Aa | od -t x1
0000000 41 61
0000002
16
Mikel
$> printf "%x%x\n" "'A" "'a"
4161
13
bash-o-logist

Pour une solution à une ligne:

echo "Hello World" | xxd -ps -c 200 | tr -d '\n'

Il imprimera:

48656c6c6f20576f726c640a

ou pour les fichiers:

cat /path/to/file | xxd -ps -c 200 | tr -d '\n'

Pour l'opération inverse:

echo '48656c6c6f20576f726c640a' | xxd -ps -r

Il imprimera:

Hello World
7
Fırat KÜÇÜK

Avec bash:

a=abcdefghij    
for ((i=0;i<${#a};i++));do printf %02X \'${a:$i:1};done

6162636465666768696A

2
Vouze

Je ne sais pas à quoi ça ressemble, mais ça fait très bien le travail

ascii2hex(){ a="$@";s=0000000;printf "$a" | hexdump | grep "^$s"| sed s/' '//g| sed s/^$s//;}

Créé ceci quand j'essayais de voir mon nom en HEX;) Utiliser comment pouvez-vous l'utiliser :)

2
Kundan Kumar
echo -n Aa | hexdump -e '/1 "%02x"'; echo
1
baz

La réponse de SteinAir ci-dessus m'a été utile - merci! Et ci-dessous est une façon inspirée de convertir des chaînes hexagonales en ascii: 

for h in $(echo "4161" | sed "s/\(..\)/\1 /g"); do printf `echo "\x$h"`;done
Aa
1
scoombs
Text2Conv="Aa"
for letter in $(echo "$Text2Conv" | sed "s/\(.\)/'\1 /g");do printf '%x' "$letter";done

4161

L'astuce consiste à utiliser sed pour analyser Text2Conv afin de formater, nous pouvons ensuite séparer une boucle en utilisant f.

1
SteinAir

voici un petit script que j'ai écrit pour convertir ascii en sortilège. J'espère que ça aide: 

echo '0x'"`echo 'ASCII INPUT GOES HERE' | hexdump -vC |  awk 'BEGIN {IFS="\t"} {$1=""; print }' | awk '{sub(/\|.*/,"")}1'  | tr -d '\n' | tr -d ' '`" | rev | cut -c 3- | rev
1
blogresponder

selon http://mylinuxbook.com/hexdump/ vous pouvez utiliser le paramètre de format hexdump

echo Aa | hexdump -C -e '/1 "%02X"'

retournera 4161

pour ajouter un saut de ligne supplémentaire à la fin, ajoutez un autre formateur.

MAIS: le format donné ci-dessus donnera des résultats multiplicateurs pour les caractères répétitifs

$ printf "Hello" | hexdump -e '/1 "%02X"' 
48656C*
6F

au lieu de 

48656c6c6f
0
childno͡.de