Au hasard dâune mise Ă jour de Linux Mint
, jâai dĂ©couvert lâexistence de la commande xxd.
A quoi sert commande xxd ?
Elle permet de faire un hexdump dâun fichier ou de reconstituer un fichier Ă partir dâun hexdump. De maniĂšre plus gĂ©nĂ©rale, elle convertit un flux en reprĂ©sentation hexadĂ©cimale et inversement.
Câest quoi un hexdump
LittĂ©ralement câest le fait de dĂ©verser un fichier sous la forme hexadĂ©cimale
.
Voici un exemple xxd FICHIER
 :
00000000: 4a42 414b 450a 3d3d 3d3d 3d0a 0a2a 2a4a JBAKE.=====..**J
00000010: 4261 6b65 2a2a 2069 7320 6120 4a61 7661 Bake** is a Java
00000020: 2062 6173 6564 2c20 6f70 656e 2073 6f75 based, open sou
00000030: 7263 652c 2073 7461 7469 6320 7369 7465 rce, static site
00000040: 2f62 6c6f 6720 6765 6e65 7261 746f 7220 /blog generator
00000050: 666f 7220 6465 7665 6c6f 7065 7273 2026 for developers &
00000060: 2064 6573 6967 6e65 7273 0a0a 0a54 6f20 designers...To
00000070: 6275 696c 6420 7468 6520 626c 6f67 2066 build the blog f
00000080: 726f 6d20 736f 7572 6365 2060 6a62 616b rom source `jbak
00000090: 6560 2069 7320 7265 7175 6972 6564 2e20 e` is required.
000000a0: 5369 6e63 6520 606a 6261 6b65 6020 6973 Since `jbake` is
Et concrÚtement, ça sert à quoi ?
xxd crĂ©e un fichier (ou un flux sur la sortie standard) contenant la reprĂ©sentation hexadĂ©cimale dâun fichier binaire ou de lâentrĂ©e standard.
xxd permet également de convertir un fichier de codes hexadécimaux en un fichier binaire.
Comme uuencode
et uudecode
il permet la transmission de donnĂ©es binaires dans une reprĂ©sentation ASCII compatible avec le courrier Ă©lectronique, mais a lâavantage de dĂ©coder la sortie standard.
Lâaspect le plus intĂ©ressant de la commande xxd est quâelle peut ĂȘtre utilisĂ©e pour appliquer des rustines (patch) Ă des fichiers binaires. En gros cela permet de « bidouiller » des fichiers binaires.
Elle permet de générer trÚs simplement le code C
équivalent au fichier donné.
Une vraie commande de geek
Une commande vraiment Ă©trange dans ces comportements, il est nĂ©cessaire de bien lire le manuelâŠ
Dâabord une mise en garde, la gestion des erreurs est trĂšs incomplĂšte. Donc ce nâest sans doute pas une bonne idĂ©e que de lâutiliser dans une chaĂźne de traitement, tout du moins, sans prendre de prĂ©caution.
Pour la lecture des paramĂštres, un analyseur simplifiĂ© (lasy) est utilisĂ©. Il ne vĂ©rifie pas au-delĂ de la premiĂšre lettre de lâoption, Ă moins que cette derniĂšre ne requiert un paramĂštre. Lâespace entre lâoption et son paramĂštre est optionnel.
Les paramĂštres des options peuvent ĂȘtre spĂ©cifiĂ©s en notation dĂ©cimale, hexadĂ©cimale ou octale. Ainsi -c8
, -c 8
, -c 010
et -cols 8
sont tous Ă©quivalents.
Manuel
SYNOPSIS
xxd -h[elp]
xxd [options] [fichier_entree [fichier_sortie]]
xxd -r[evert] [options] [fichier_entree [fichier_sortie]]
OPTIONS
- Si aucun fichier_entree nâest spĂ©cifiĂ©, lâentrĂ©e standard est utilisĂ©e.
- Si fichier_entree correspond au caractĂšre â-â lâentrĂ©e standard est utilisĂ©e comme source des donnĂ©es.
- Si aucun fichier_sortie nâest spĂ©cifiĂ© (ou quâun caractĂšre â-â est donnĂ© Ă sa place), le rĂ©sultat est envoyĂ© sur la sortie standard.
-a
| -autoskip
Active la fonctionnalitĂ© « autoskip » : le caractĂšre â*â remplace les lignes dâoctets nuls. DĂ©sactivĂ©e par dĂ©faut.
-b
| -bits
Convertis en binaires plutĂŽt quâen hexadĂ©cimal. Cette option Ă©crit les octets comme une sĂ©quence de « 1 » et de « 0 » au lieu dâune conversion en hexadĂ©cimal traditionnel. Chaque ligne est prĂ©cĂ©dĂ©e par un numĂ©ro de ligne en hexadĂ©cimal et suivie de la reprĂ©sentation ASCII (ou EBCDIC) correspondante. Les options -r
, -p
, -i
ne fonctionnent pas dans ce mode.
-c cols
| -cols cols
Place « cols » octets par ligne. 16 par défaut (-i : 12, -ps : 30, -b : 6). Maximum 256.
-E
| -EBCDIC
Passe le codage des caractÚres de la colonne de droite de ASCII à EBCDIC. Cela ne change pas la représentation hexadécimale. Cette option est sans effet quand elle est utilisée avec -r
, -p
or -i
.
-g octets
| -groupsize octets
Regroupe les octets (deux chiffres hexadécimaux ou huit chiffres binaires) par groupe de « octets » séparés par des espaces blancs. Spécifiez -g 0
pour supprimer le regroupement. « octets » vaut 2 par dĂ©faut dans le mode normal et 1 en reprĂ©sentation binaire. Le regroupement ne sâapplique pas aux styles Postscript et Include.
-h
| -help
Affiche un rĂ©sumĂ© des commandes disponibles et quitte. Aucune conversion nâest effectuĂ©e.
-i
| -include
Produit une sortie dans le style #include (fichier C Ă inclure). La dĂ©finition complĂšte dâun tableau statique est Ă©crite et est nommĂ©e dâaprĂšs le fichier dâorigine, Ă moins que xxd lise depuis lâentrĂ©e standard.
-l long
| -len long
ArrĂȘte aprĂšs lâĂ©criture de « long » octets.
-p
| -ps
| -postscript
| -plain
Produit une conversion continue dans le style Postscript (postscript continuous hexdumd style). Ăgalement connu sous le nom de « conversion brute » (plain hexdump style).
-r
| -revert
Opération inverse : convertis un fichier hexadécimal en un fichier binaire (ou applique une rustine à un fichier binaire).
Si lâĂ©criture nâa pas lieu sur la sortie standard, xxd Ă©crit dans le fichier quâil produit sans le tronquer. Utilisez la combinaison -r -p
pour lire de lâhexadĂ©cimal brut sans information sur le numĂ©ro des lignes et sans format de colonnes particulier. Des espaces blancs et coupures de lignes supplĂ©mentaires sont autorisĂ©s Ă nâimporte quel endroit.
-seek décalage
UtilisĂ© aprĂšs lâoption -r
inverse la conversion en ajoutant « décalage » aux positions dans le fichier donné dans le code hexadécimal.
-s [+][-]décalage
Débute au « décalage » absolu ou relatif dans fichier_entree. +
indique que le dĂ©calage est relatif Ă la position courante dans lâentrĂ©e standard (sans effet si la lecture nâa pas lieu sur lâentrĂ©e standard). -
indique un dĂ©calage en caractĂšres depuis la fin de lâentrĂ©e (utilisĂ© avec +
, dĂ©signe la position avant la position actuelle de lâentrĂ©e standard). Sans lâoption -s
, xxd démarre à la position courante du fichier.
-u
Utilise des chiffres hexadécimaux majuscules. La casse par défaut est minuscule.
-v
| -version
Affiche la version de xxd.
MISE EN GARDE
xxd -r
effectue des opĂ©rations internes un peu obscures lors de lâĂ©valuation des informations sur les numĂ©ros de lignes. Si le fichier de sortie est adressable, alors les numĂ©ros de lignes au dĂ©but de chaque ligne dâhexadĂ©cimal peuvent ĂȘtre dĂ©sordonnĂ©es, des lignes peuvent manquer ou se chevaucher. Dans ces cas, xxd utilisera lseek(2) pour dĂ©terminer la prochaine position. Si le fichier nâest pas adressable, seuls les vides sont autorisĂ©s, et ils seront comblĂ©s par des octets nuls.
xxd -r
ne gĂ©nĂšre aucune erreur lors de lâanalyse. Le problĂšme sont passĂ©s silencieusement.
Lors de lâĂ©dition de la reprĂ©sentation hexadĂ©cimale, veuillez noter que xxd -r
ignore tout ce qui se trouve sur la ligne aprĂšs avoir lu suffisamment de donnĂ©es hexadĂ©cimales (voir lâoption -c). Cela signifie Ă©galement que les modifications dans la colonne ASCII (ou EBCDIC) sont toujours ignorĂ©es. La conversion inverse de donnĂ©es hexadĂ©cimales brutes (postscript) avec xxd -r -p
ne dĂ©pend pas dâun nombre correct de colonnes. Dans ce cas, tout ce qui ressemble Ă une paire de chiffres hexadĂ©cimaux est interprĂ©tĂ©.
Remarquez la différence entre :
xxd -i fichier
et
xxd -i < fichier
xxd -s +seek
peut différer de xxd -s seek
, car lseek(2) est utilisĂ© pour « revenir en arriĂšre ». Le â+â fait une diffĂ©rence quand la source des donnĂ©es est lâentrĂ©e standard et si la position dans le fichier de lâentrĂ©e standard nâest pas au dĂ©but du fichier lorsque xxd est dĂ©marrĂ© et quâil reçoit ses donnĂ©es. Lâexemple suivant peut vous aider Ă comprendre (ou bien vous perdre davantage encore !)âŠ
Remettre lâentrĂ©e standard au dĂ©part avant de lire ; nĂ©cessaire car âcatâ a dĂ©jĂ lu jusquâĂ la fin de lâentrĂ©e standard.
sh -c cat > donnees_binaires; xxd -s 0 > donnees_hexa < fichier
Convertir Ă partir de la position 0x480 (= 1024 + 128) du fichier. Le symbole â+â signifie « relativement Ă la position actuelle », ainsi 128 est ajoutĂ© aux 1024 octets comptabilisĂ©s pour dd.
sh -c dd of=donnees_binaires bs=1k count=1; xxd -s +128 > donnees_hexa < fichier
Convertir de fichier depuis la position 0x100 (= 1024 â 768) du fichier.
sh -c dd of=donnees_binaires bs=1k count=1; xxd -s +-768 > donnees_hexa < fichier
Toutefois, cette situation est peu frĂ©quente et lâutilisation de â+â est rarement requise. Lâauteur prĂ©fĂšre surveiller les effets de xxd avec strace(1) ou truss(1) quand -s
est employé.
EXEMPLES
Afficher la totalité du fichier sauf les trois premiÚres lignes (0x30 octets en hexadécimal).
xxd -s 0x30 fichier
Afficher les trois derniÚres lignes (0x30 octets en hexadécimal) du fichier
xxd -s -0x30 fichier
Afficher 120 octets convertis en continu, avec 20 octets par ligne.
xxd -l 120 -ps -c 20 xxd.1
2e54482058584420312022616ffb742031393936
22202250616765206465206d616e75656c20706f
757220787864220a2e5c220a2e5c222032317374
204d617920313939360a2e5c22204d616e207061
676520617574686f723a0a2e5c2220202020546f
6e79204e7567656e74203c746f6e79407363746e
204e7567656e74203c746f6e79407363746e7567
2e54482058584420312022417567757374203139
Convertir les 120 premiers octets de cette page de manuel avec 12 octets par ligne.
xxd -l 120 -c 12 xxd.1
0000000: 2e54 4820 5858 4420 3120 2241 .TH XXD 1 "A
000000c: 7567 7573 7420 3139 3936 2220 ugust 1996"
0000018: 224d 616e 7561 6c20 7061 6765 "Manual page
0000024: 2066 6f72 2078 7864 220a 2e5c for xxd"..\
0000030: 220a 2e5c 2220 3231 7374 204d "..\" 21st M
000003c: 6179 2031 3939 360a 2e5c 2220 ay 1996..\"
0000048: 4d61 6e20 7061 6765 2061 7574 Man page aut
0000054: 686f 723a 0a2e 5c22 2020 2020 hor:..\"
0000060: 546f 6e79 204e 7567 656e 7420 Tony Nugent
000006c: 3c74 6f6e 7940 7363 746e 7567 <tony@sctnug
Afficher la date écrite au début du fichier xxd.1.
xxd -s 0x38 -l 13 -c 13 xxd.1
0000036: 3231 7374 204d 6179 2031 3939 36 21st May 1996
Copier fichier_entree vers fichier_sortie en ajoutant 100 octets de valeur 0x00 avant.
xxd fichier_entree | xxd -r -s 100 > fichier_sortie
Patcher la date dans le fichier xxd.1
echo "0000037: 3574 68" | xxd -r - xxd.1
xxd -s 0x36 -l 13 -c 13 xxd.1
0000036: 3235 7468 204d 6179 2031 3939 36 25th May 1996
CrĂ©er un fichier de 65 537 octets tous nuls (0x00), sauf le dernier qui vaut âAâ (0x41 en hexadĂ©cimal).
echo 010000: 41 | xxd -r > fichier
Convertir le fichier de lâexemple prĂ©cĂ©dent avec la fonctionnalitĂ© « autoskip ».
xxd -a -c 12 fichier
0000000: 0000 0000 0000 0000 0000 0000 ............
*
000fffc: 0000 0000 40 ....A
CrĂ©er un fichier dâun octet, contenant seulement le caractĂšre 'A'. Les nombres aprĂšs -r -s
sâajoutent aux numĂ©ros de lignes trouvĂ©es dans le fichier ; les octets initiaux sont supprimĂ©s.
echo 010000: 41 | xxd -r -s -0x10000 > fichier
Utiliser xxd comme filtre dans un Ă©diteur tel que vim(1) pour convertir une zone comprise entre les marques âaâ et âzâ.
:a,z!xxd
Utiliser xxd comme filtre dans un Ă©diteur tel que vim(1) pour rĂ©cupĂ©rer une conversion binaire comprise entre les marques âaâ et âzâ.
:a,z!xxd -r
Utiliser xxd comme filtre dans un éditeur tel que vim(1) pour récupérer une ligne convertie. Placez le curseur sur la ligne et tapez :
!!xxd -r
Lire des caractÚres depuis une connexion série :
xxd -c1 < /dev/term/b &
stty < /dev/term/b -echo -opost -isig -icanon min 1
echo -n foo > /dev/term/b
VALEURS DE RETOUR
Les erreurs suivantes sont rapportées :
Valeur | Description |
---|---|
0 | Aucune erreur ne sâest produit. |
-1 | Opération non supportée ( xxd -r -i reste impossible). |
1 | Erreur lors de lâanalyse des options. |
2 | ProblĂšme avec le fichier dâentrĂ©e. |
3 | ProblĂšme avec le fichier de sortie. |
4 | La position spĂ©cifiĂ©e nâest pas atteignable. |
5 | La position spĂ©cifiĂ©e nâest pas atteignable. |
AVERTISSEMENTS
LâĂ©trangetĂ© de cet outil reflĂšte celle du cerveau de ses crĂ©ateurs. Utilisez cet outil Ă vos risques et pĂ©rils. Dupliquez vos fichiers. Surveillez lâoutil. Devenez un gourou.
Références
- Man page xxd,
- Le systÚme hexadécimal.
኿