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)
8 réponses
peut-être utiliser xxd
:
% xxd -l 16 -p /dev/random
193f6c54814f0576bc27d51ab39081dc
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
$ 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."
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.
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'imprimer1,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 binaireshead -c 5
- limite les données binaires à 5 octetsod -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
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.
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