Самый простой способ - использовать binary
опцию. От :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.
Если вы этого не делаете, и ваша среда использует многобайтовую кодировку (например, UTF-8, которую использует большинство людей), Vim пытается закодировать текст как таковой, что обычно приводит к повреждению файла.
Вы можете убедиться в этом, открыв файл и просто используя :w
. Сейчас это изменилось.
Если вы установите LANG
и LC_ALL
в C
(ASCII), Vim ничего не конвертирует, а файлы остаются прежними (хотя он все равно добавляет новую строку), поскольку Vim не нужно выполнять многобайтовое кодирование.
Я лично также предпочитаю отключить set wrap
для двоичного файла, хотя другие могут предпочесть включить его. YMMV. Еще одна полезная вещь, чтобы сделать это :set display=uhex
. От :help 'display'
:
uhex Show unprintable characters hexadecimal as <xx>
instead of using ^C and ~C.
И, как последний совет, вы можете показать шестнадцатеричное значение символа под курсором в линейке с помощью %B
( :set rulerformat=0x%B
).
Более продвинутый: xxd
Вы можете использовать xxd(1)
инструмент для преобразования файла в более читаемый формат и (это важный бит), проанализировать отредактированный «читаемый формат» и записать его обратно как двоичные данные. xxd
является частью vim
, поэтому, если вы vim
установили, вы также должны иметь xxd
.
Чтобы использовать это:
$ xxd /bin/ls | vi -
Или, если вы уже открыли файл, вы можете использовать:
:%!xxd
Теперь внесите изменения, вам нужно сделать это в левой части экрана (шестнадцатеричные числа), изменения в правой части (печатное представление) игнорируются при записи.
Чтобы сохранить его, используйте xxd -r
:
:%!xxd -r > new-ls
Это сохранит файл в new-ls
.
Или загрузить двоичный файл в текущий буфер:
:%!xxd -r
От 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.
А потом просто используйте, :w
чтобы написать это. ( будьте осторожны : вы хотите установить binary
опцию перед записью в файл, по тем же причинам, изложенным выше).
Дополнительные сочетания клавиш, чтобы сделать это немного проще:
" 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>
Это также доступно из меню, если вы используете gVim, в «Инструменты ➙ Преобразовать в HEX» и «Инструменты ➙ Преобразовать обратно».
В вики подсказках есть страница с дополнительной информацией и некоторыми вспомогательными скриптами. Лично я думаю, что вам лучше использовать настоящий шестнадцатеричный редактор, если вы часто редактируете двоичные файлы. Vim может
выполнять свою работу, но он явно не предназначен для этого, и если вы когда-либо будете писать без :set binary
Vim, вы можете уничтожить ваши двоичные файлы!
:set binary noeol fenc=utf-8
. На самом деле, он делает это сразу после открытия файла, прежде чем он говорит[noeol] [converted]
. Почему vim нужно увеличить буфер на 150%? Как я могу предотвратить повреждение файлов?:r !xxd <file>
(или$ xxd <file> | vim -
) читать и:w !xxd -r > <file>
писать, но это не идеально.Чтобы просмотреть содержимое двоичного файла в шестнадцатеричном представлении, откройте файл, включите двоичный режим и отфильтруйте буфер с помощью
xxd
команды:Вы можете внести изменения в левой области (отредактировать шестнадцатеричные числа), а когда будете готовы, отфильтровать
xxd -r
и, наконец, сохранить файл:Если этап фильтрации после открытия и перед закрытием звучит утомительно, и вы часто делаете это с файлами с
.bin
расширением, вы можете добавить это в свой vimrc, чтобы сделать процесс автоматическим:источник
:%!xxd
,:%!xxd -r
,:w
, не сделало никаких изменений!) , То бинарный файл , написанный является не то же самое, что и оригинал ... Является ли это дело для вас (я тестировал с/bin/ls
). Мне нужно использовать:set binary
перед сохранением (см. Также мой ответ, который объясняет, почему) ... Может быть, это что-то в моем vimrc? Но независимо от того, я бы всегда использовалset binary
для безопасности ...augroup
скрипт,~/.vim/plugin/binary.vim
если не хотите загромождать свой.vimrc
augroup Binary
список находится в Vim:help hex-editing
или:help using-xxd
в любом из них начиная с 5.5 (сентябрь 1999 г.).Используйте редактор "bvi". http://bvi.sourceforge.net/ (это есть в каждом репозитории Linux.)
источник
TL; DR Ответ
Откройте файл с помощью Vim в двоичном режиме:
В Vim перейдите в режим редактирования в шестнадцатеричном формате так:
Сохранить:
Это преобразует буфер обратно из шестнадцатеричного режима и затем сохраняет файл как обычно.
Обратите внимание на параметр -p. Это позволяет избежать лишнего печатного и адресного пуха и просто показывает вам гекс. Просто опустите -p, если вы хотите дополнительный контекст.
Будьте осторожны, открывая файл с Vim не в двоичном режиме, так как он добавит (обычно непреднамеренный) символ LF в конец файла при его сохранении.
источник
:h using-xxd
и существует уже с тех порv7.0001
и, вероятно, дольше. Этот сайт будет менее активным, если люди будут искать документы.Это похоже на удобный маленький плагин vim, который выполняет работу, используя временный файл, который он записывает для вас автоматически.
Несколько лет назад я нашел похожий плагин, который я адаптировал и улучшил для собственного использования. Я включил соответствующий код здесь, на случай, если кто-то захочет. Это тоже основано на инструменте xxd. Я уверен, что версия GitHub, которую я связал выше, работает лучше, но я на самом деле не использовал ее сам, поэтому я решил, что я также опубликую эту, которая, я знаю, работает точно.
Источником для этой другой версии была vim wikia, а именно эта страница .
Вот код:
источник