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)
Peut-être utiliser xxd
:
% xxd -l 16 -p /dev/random
193f6c54814f0576bc27d51ab39081dc
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
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."
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.
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,' 1 2 3
, imprimera 1,2,3,
cat /dev/urandom
- il génère des données binaires aléatoireshead -c 5
- limite les données binaires à 5 octetsod -An -vtu1
- commande octal dump, convertit le binaire en décimalen 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
dd + hexdump fonctionnera également:
dd bs=1 count=1 if=/dev/urandom 2>/dev/null | hexdump -e '"%x"'
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é.
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