convertir des données binaires en hex en script shell?

se sentir un peu stupide en posant cette question (sonne comme des bases) mais ne peut pas trouver de réponse ailleurs. Je veux convertir les données binaires en hex, juste ça, pas de formatage fantaisiste et tout. hexdump semble trop intelligent, il "surformats" pour moi. Je veux prendre les X octets du /dev / random et les transmettre en hexadécimal.

de préférence, je voudrais utiliser seulement les outils linux standard, de sorte que je n'ai pas besoin de l'installer sur chaque machine (il y en a beaucoup)

38
demandé sur davka 2011-06-09 16:16:45

8 réponses

peut-être utiliser xxd:

% xxd -l 16 -p /dev/random
193f6c54814f0576bc27d51ab39081dc
55
répondu unutbu 2011-06-09 12:22:04

attention!

hexdump et xxd donner les résultats dans une autre endianness!

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

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

26
répondu Zibri 2013-06-18 23:30:40
$ echo abc | od -A n -v -t x1 | tr -d ' \n'
6162630a
$ echo abc | hexdump -ve '/1 "%02x"'
6162630a

http://en.wikipedia.org/wiki/Hex_dump#od_and_hexdump:

"Selon votre type de système, l'un ou l'autre de ces deux utilitaires ou les deux seront disponibles--les systèmes BSD déprécient od pour hexdump, les systèmes GNU l'inverse."

20
répondu Håkon A. Hjortland 2012-07-27 12:13:15

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 ensuite l'alimenter à 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.

8
répondu Blagovest Buyukliev 2011-06-09 12:39:16

toutes les solutions semblent être difficiles à retenir ou trop complexes, je trouve en utilisant printf le plus court:

$ printf '%x\n' 256
100

[edit]

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

... pour utiliser au-dessus de la sortie binaire réel des flux de données:

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, permet d'imprimer 1,2,3,
  • $(...) - c'est une façon d'obtenir la sortie d'une commande shell et de la traiter
  • cat /dev/urandom sorties aléatoires des données binaires
  • head -c 5 - limite les données binaires à 5 octets
  • od -An -vtu1 - commande octal dump, convertit binaire en décimal

comme un testcase ('a' est 61 hex,' p ' est 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, à l'entrée permet de donner 61 décimal ('='char) pour produire binaire de données ('\x%x' format does it), la commande ci-dessus affichera correctement la sortie 3d (décimale 61):

$printf '%x\n' $(echo -ne "$(printf '\x%x' 61)" | head -c 5 | od -An -vtu1)
3d
5
répondu marcinj 2017-08-27 06:25:50

dd + hexdump travaillera aussi:

dd bs=1 count=1 if=/dev/urandom 2>/dev/null  | hexdump -e '"%x"'
3
répondu 2011-06-09 12:32:40

si vous avez besoin d'un grand flux (pas de newlines) vous pouvez utiliser tr et xxd (partie de vim) pour la conversion byte-by-byte.

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

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

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

Notez que la différence est boutisme.

1
répondu Kevin Cox 2013-11-12 18:35:36

ces trois commandes imprimeront la même (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 est la valeur d'octet de 1 à 26:

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

Qui peut être utilisée pour obtenir $n valeurs des octets aléatoires 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
répondu 2015-11-16 00:48:23