web-dev-qa-db-fra.com

convertir des données binaires en hexadécimal dans un script Shell?

je me sens un peu stupide de demander cela (cela semble être la base), mais je ne trouve pas de réponse ailleurs. Je veux convertir des données binaires en hexadécimal, rien que cela, aucun formatage sophistiqué et tout. hexdump semble trop intelligent, il "surformate" pour moi. Je veux prendre x octets dans/dev/random et les transmettre au format hexadécimal.

De préférence, je voudrais n'utiliser que des outils Linux standards, de sorte que je n'ai pas besoin de l'installer sur chaque machine (il y en a beaucoup)

43
davka

Peut-être utiliser xxd:

% xxd -l 16 -p /dev/random
193f6c54814f0576bc27d51ab39081dc
62
unutbu

Fais attention!

hexdump et xxd donnent les résultats dans différentes endianités!

$ echo -n $'\x12\x34' | xxd -p
1234
$ echo -n $'\x12\x34' | hexdump -e '"%x"'
3412

http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef01543533e604970c-800wi : D

29
Zibri

Avec od (systèmes GNU):

$ echo abc | od -A n -v -t x1 | tr -d ' \n'
6162630a

Avec hexdump (systèmes BSD):

$ echo abc | hexdump -ve '/1 "%02x"'
6162630a

De http://en.wikipedia.org/wiki/Hex_dump#od_and_hexdump :
"Selon le type de votre système, l'un ou l'autre ou les deux utilitaires seront disponibles - les systèmes BSD déconseillent od pour hexdump, GNU systèmes inversement."

21
Håkon A. Hjortland

Peut-être pourriez-vous écrire votre propre petit outil en C et le compiler à la volée:

int main (void) {
  unsigned char data[1024];
  size_t numread, i;

  while ((numread = read(0, data, 1024)) > 0) {
    for (i = 0; i < numread; i++) {
      printf("%02x ", data[i]);
    }
  }

  return 0;
}

Et puis alimentez-le à partir de l'entrée standard:

cat /bin/ls | ./a.out

Vous pouvez même intégrer ce petit programme C dans un script Shell en utilisant la syntaxe Heredoc.

9

Toutes les solutions semblent difficiles à retenir ou trop complexes, je trouve que printf est la plus courte:

$ printf '%x\n' 256
100

[modifier]

Mais comme noté dans les commentaires, ce n'est pas ce que l'auteur veut, donc être juste ci-dessous est une réponse complète. 

... à utiliser ci-dessus pour générer un flux de données binaire réel:

printf '%x\n' $(cat /dev/urandom | head -c 5 | od -An -vtu1)

ce qu'il fait:

  • printf '% x\n' .... - imprime une séquence d'entiers, c'est-à-dire. printf '%x,' 1 2 3, imprimera 1,2,3,
  • $ (...) - c'est un moyen d'obtenir le résultat d'une commande Shell et de le traiter
  • cat /dev/urandom - il génère des données binaires aléatoires
  • head -c 5 - limite les données binaires à 5 octets
  • od -An -vtu1 - commande octal dump, convertit le binaire en décimal

en tant que test case ('a' est de 61 hex, 'p' est de 70 hex, ...):

$ printf '%x\n' $(echo "Apple" | head -c 5 | od -An -vtu1)
61
70
70
6c
65

ou pour tester des octets binaires individuels, donne en entrée 61 décimales ('=' char) pour produire des données binaires (le format '\\x%x' le fait), la commande ci-dessus affichera correctement la valeur 3D (décimal 61):

$printf '%x\n' $(echo -ne "$(printf '\\x%x' 61)" | head -c 5 | od -An -vtu1)
3d
5
marcinj

dd + hexdump fonctionnera également:

dd bs=1 count=1 if=/dev/urandom 2>/dev/null  | hexdump -e '"%x"'
3
user405725

Si vous avez besoin d'un flux important (pas de saut de ligne), vous pouvez utiliser tr et xxd (partie de vim) pour la conversion octet par octet.

head -c1024 /dev/urandom | xxd -p | tr -d $'\n'

Ou vous pouvez utiliser hexdump (posix) pour la conversion mot à mot.

head -c1024 /dev/urandom | hexdump '-e"%x"'

Notez que la différence est endianité.

3
Kevin Cox

Ces trois commandes afficheront la même chose (0102030405060708090a0b0c):

n=12
echo "$a" | xxd -l "$n" -p
echo "$a" | od  -N "$n" -An -tx1 | tr -d " \n" ; echo
echo "$a" | hexdump -n "$n" -e '/1 "%02x"'; echo

Étant donné que n=12 et $a sont les valeurs d'octet de 1 à 26:

a="$(printf '%b' "$(printf '\\0%o' {1..26})")"

Cela pourrait être utilisé pour obtenir des valeurs d'octets aléatoires $n dans chaque programme:

xxd -l "$n" -p                   /dev/urandom
od  -vN "$n" -An -tx1            /dev/urandom | tr -d " \n" ; echo
hexdump -vn "$n" -e '/1 "%02x"'  /dev/urandom ; echo
1
user2350426