Comment créer un vidage hexadécimal d'un fichier contenant uniquement les caractères hexadécimaux sans espaces dans bash?

188

Comment créer un vidage hexadécimal non modifié d'un fichier binaire sous Linux à l'aide de bash? Les odet hexdumpcommandes les deux espaces d'insertion dans la décharge et ce n'est pas idéal.

Existe-t-il un moyen d'écrire simplement une longue chaîne avec tous les caractères hexadécimaux, moins les espaces ou les retours à la ligne dans la sortie?

David Raswik
la source

Réponses:

250

xxd -p file

Ou si vous voulez tout sur une seule ligne:

xxd -p file | tr -d '\n'

mark4o
la source
13
fyi Pour inverser le processus: xxd -r -ps fichier hexascii.txt (c'est ok avec ou sans saut de ligne)
Curtis Yallop
92

Les chaînes de format peuvent faire en sorte que hexdump se comporte exactement comme vous le souhaitez (pas d'espaces du tout, octet par octet):

hexdump -ve '1/1 "%.2x"'

1/1signifie "chaque format est appliqué une fois et prend un octet", et "%.2x"est la chaîne de format réelle, comme dans printf. Dans ce cas: nombre hexadécimal à 2 caractères, zéros non significatifs s'ils sont plus courts.

Michał Trybus
la source
7
Vous avez besoin d'un -vou il supprimera les octets répétés et les remplacera par un astérisque.
Suspendu jusqu'à nouvel ordre.
2
Je me demande si hexdump lui-même est capable d'ajouter la nouvelle ligne (uniquement) à la fin de la sortie .. (appendice évident de ; echorend impossible l'utilisation comme alias bash)
mykhal
2
Mon alias:alias to_hex="hexdump -ve '1/1 \"%.2x\"' && echo"
devstuff
Le nombre d'itérations et le nombre d'octets par défaut à un, donc 1/1 peut être omis, laissant lehexdump -ve '"%.2x"'
Alex Che
@mykhal, c'est possible, si vous connaissez le nombre d'octets en sortie. Dites si vous utilisez hexdump pour ne sortir que 13 premiers octets:hexdump -n 13 -e '13/1 "%.2x" "\n"'
Alex Che
24

Cela semble dépendre des détails de la version de od. Sur OSX, utilisez ceci:

od -t x1 -An file |tr -d '\n '

(C'est imprimer sous forme d'octets hexadécimaux, sans adresse. Et les espaces supprimés par la suite, bien sûr.)

Boursiers Donal
la source
1
J'ajouterais également -vdans ce contexte, sinon il saute les répétitions avec *.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
10

Perl one-liner:

perl -e 'local $/; print unpack "H*", <>' file
Alan Haggai Alavi
la source
Vérifié. Correspond à "xxd -p fichier | tr -d '\ n'".
Curtis Yallop
1
fyi Pour inverser le processus: perl -e 'local $ /; print pack "H *", <> '<hexascii.txt> file
Curtis Yallop
Le "$ / local" est inutile.
Curtis Yallop
Mise à jour jusqu'au dernier commentaire: Le "local $ /" n'est pas nécessaire pour "pack". Pour unpack, vous en avez besoin mais vous pouvez également mettre "undef $ /". $ / est le séparateur de ligne (NL par défaut). undefined le met en mode slurp. Ainsi <> référencé dans un contexte de chaîne extrait le fichier binaire entier sans l'analyser en lignes.
Curtis Yallop
Autre forme: perl -e 'print décompresser "H *", join ("", <>)' <fichier
Curtis Yallop
2

Les autres réponses sont préférables, mais pour une solution pure Bash, j'ai modifié le script dans ma réponse ici pour pouvoir sortir un flux continu de caractères hexadécimaux représentant le contenu d'un fichier. (Son mode normal est d'émuler hexdump -C.)

Suspendu jusqu'à nouvel ordre.
la source