Le moyen le plus simple consiste à utiliser l' binary
option. De :help binary
:
This option should be set before editing a binary file. You can also
use the -b Vim argument. When this option is switched on a few
options will be changed (also when it already was on):
'textwidth' will be set to 0
'wrapmargin' will be set to 0
'modeline' will be off
'expandtab' will be off
Also, 'fileformat' and 'fileformats' options will not be used, the
file is read and written like 'fileformat' was "unix" (a single <NL>
separates lines).
The 'fileencoding' and 'fileencodings' options will not be used, the
file is read without conversion.
[..]
When writing a file the <EOL> for the last line is only written if
there was one in the original file (normally Vim appends an <EOL> to
the last line if there is none; this would make the file longer). See
the 'endofline' option.
Si vous ne le faites pas et que votre environnement utilise un codage multi-octets (par exemple, UTF-8, comme le font la plupart des utilisateurs), Vim tente de coder le texte en tant que tel, ce qui entraîne généralement une corruption du fichier.
Vous pouvez le vérifier en ouvrant un fichier et en utilisant simplement :w
. C'est maintenant changé.
Si vous définissez LANG
et LC_ALL
sur C
(ASCII), Vim ne convertit rien et les fichiers restent identiques (il ajoute néanmoins une nouvelle ligne), car Vim n'aura pas besoin de codage multi-octets.
Personnellement, je préfère aussi désactiver set wrap
pour le binaire, bien que d’autres préfèrent l’ activer . YMMV. Une autre chose utile à faire est :set display=uhex
. De :help 'display'
:
uhex Show unprintable characters hexadecimal as <xx>
instead of using ^C and ~C.
Et comme dernier conseil, vous pouvez afficher la valeur hexadécimale du caractère situé sous le curseur dans la règle avec %B
( :set rulerformat=0x%B
).
Plus avancé: xxd
Vous pouvez utiliser l' xxd(1)
outil pour convertir un fichier dans un format plus lisible, et (c'est le bit important), analyser le "format lisible" édité et le réécrire sous forme de données binaires. xxd
fait partie de vim
, donc si vous avez vim
installé, vous devriez également avoir xxd
.
Pour l'utiliser:
$ xxd /bin/ls | vi -
Ou si vous avez déjà ouvert le fichier, vous pouvez utiliser:
:%!xxd
Maintenant, apportez vos modifications. Vous devez le faire dans la partie gauche de l’affichage (les nombres hexadécimaux). Les modifications dans la partie droite (représentation imprimable) sont ignorées lors de l’écriture.
Pour le sauvegarder, utilisez xxd -r
:
:%!xxd -r > new-ls
Cela enregistrera le fichier dans new-ls
.
Ou pour charger le binaire dans le tampon courant:
:%!xxd -r
De xxd(1)
:
-r | -revert
reverse operation: convert (or patch) hexdump into binary. If
not writing to stdout, xxd writes into its output file without
truncating it. Use the combination -r -p to read plain hexadeci‐
mal dumps without line number information and without a particu‐
lar column layout. Additional Whitespace and line-breaks are
allowed anywhere.
Et puis juste utiliser :w
pour l'écrire. ( attention : vous souhaitez définir l' binary
option avant d'écrire dans le fichier, pour les mêmes raisons que celles décrites ci-dessus).
Des clés complémentaires pour rendre cela un peu plus facile:
" Hex read
nmap <Leader>hr :%!xxd<CR> :set filetype=xxd<CR>
" Hex write
nmap <Leader>hw :%!xxd -r<CR> :set binary<CR> :set filetype=<CR>
Ceci est également disponible dans le menu si vous utilisez gVim, sous «Outils Convertir en HEX» et «Outils Convertir en arrière».
Le wiki vim tips a une page avec plus d’informations et des scripts d’aide. Personnellement, je pense que vous feriez probablement mieux d'utiliser un véritable éditeur hexadécimal si vous modifiez souvent des fichiers binaires. Vim peut en
quelque sorte faire le travail, mais ce n’est évidemment pas conçu pour cela, et si jamais vous écrivez sans :set binary
Vim, vos fichiers binaires seront détruits!
:set binary noeol fenc=utf-8
. En fait, il le fait immédiatement après l'ouverture du fichier avant que cela ne soit indiqué[noeol] [converted]
. Pourquoi vim doit-il agrandir le tampon de 150%? Comment puis-je l'empêcher de corrompre des fichiers comme ça?:r !xxd <file>
(ou$ xxd <file> | vim -
) lire et:w !xxd -r > <file>
écrire, mais ce n’est pas idéal.Pour afficher le contenu d'un fichier binaire dans une vue hexadécimale, ouvrez-le, activez le mode binaire et filtrez le tampon à l'aide de la
xxd
commande:Vous pouvez apporter des modifications dans la zone de gauche (éditer les nombres hexadécimaux) et, une fois prêt, filtrer
xxd -r
et enfin enregistrer le fichier:Si l'étape de filtrage après l'ouverture et avant la fermeture vous semble fastidieuse, et que vous le faites souvent avec des fichiers avec une
.bin
extension, vous pouvez l'ajouter à votre vimrc pour automatiser le processus:la source
:%!xxd
,:%!xxd -r
,:w
, na pas apporter des modifications!) Le fichier binaire écrit est pas le même que l'original ... Est - ce le cas pour vous (je l' ai testé avec/bin/ls
). J'ai besoin d'utiliser:set binary
avant de sauvegarder (voir aussi ma réponse qui explique pourquoi) ... Peut-être que c'est quelque chose dans mon vimrc? Mais peu importe, j'utiliserais toujoursset binary
pour la sécurité ...augroup
script à~/.vim/plugin/binary.vim
si vous ne souhaitez pas encombrer votre.vimrc
augroup Binary
liste est située dans:help hex-editing
ou:help using-xxd
dans n’importe quel Vim depuis la version 5.5 (septembre 1999).Utilisez l'éditeur "bvi". http://bvi.sourceforge.net/ (il se trouve dans tous les référentiels Linux.)
la source
Réponse de TL; DR
Ouvrez le fichier avec Vim en mode binaire:
Dans Vim, passez en mode d'édition hexadécimale comme ceci:
Sauver:
Cela reconvertira le tampon du mode hexadécimal, puis sauvegardera le fichier normalement.
Notez l'option -p. Cela évite tous les bourrages d'adresse et d'adresses imprimables et vous montre juste l'hex. Oubliez simplement -p si vous voulez le contexte supplémentaire.
Soyez prudent lorsque vous ouvrez le fichier avec Vim non en mode binaire, car cela ajoutera un caractère LF (généralement non souhaité) à la fin du fichier lorsque vous l'enregistrez.
la source
:h using-xxd
et a été autour depuisv7.0001
et probablement plus longtemps. Ce site serait moins actif si les gens cherchaient dans la documentation.Cela ressemble à un petit plugin vim très pratique qui fait le travail en utilisant un fichier temporaire qu’il écrit automatiquement pour vous.
Il y a quelques années, j'ai trouvé un plugin similaire que j'ai adapté et amélioré pour mon propre usage. J'ai inclus le code correspondant à cela ici, au cas où quelqu'un le voudrait. Il est également basé sur l'outil xxd. Je suis sûr que la version de GitHub que j'ai liée ci-dessus fonctionne mieux, mais je ne l'ai pas utilisée moi-même. Je me suis donc dit que je publierais aussi celle-ci qui, je le sais, fonctionne.
La source de cette autre version était vim wikia, plus précisément cette page .
Voici le code:
la source