Vim изменяет файл, если используется с xxd
Я пытаюсь понять, как работают теги ID3, поэтому, прочитав некоторую документацию, я начал просматривать некоторые необработанные данные mp3. Обычно Vim - мой предпочтительный редактор, поэтому после некоторого поиска в Google я обнаружил, что могу использовать xxd, чтобы увидеть шестнадцатеричное представление моих файлов, вызвав
:%!xxd
Все работало нормально, но когда я привел все в порядок с
:%!xxd -r
и выйти, я узнал, что файл был изменен; VLC больше не мог воспроизводить его, и diff сказал мне, что файлы различаются. Я думал, что что-то изменил случайно, но дальнейшие эксперименты показали, что даже открытие файла и использование xxd, а затем xxd -r каким-то образом изменяет файл.
Это почему? Как я могу предотвратить это? Я делаю что-то неправильно?
3 ответа
Очевидно, что если вы не собираетесь что-либо менять в файле, вы можете выйти vim
с помощью :q!
,
Как указывает @RunHolt, vim
а также xxd
Можно изменить двоичный файл. например, изменение LF на CRLF или добавление символа LF в конец файла.
Вы можете предотвратить это, установив binary
опция:
Либо начать vim
как: vim -b filename
или введите :set binary
перед загрузкой файла в буфер.
Вы, вероятно, не загрузили файл как двоичный файл с vim -b
, Т.е. ущерб уже был нанесен.
xxd
здесь красная сельдь; xxd
с последующим xxd -r
прозрачный Предназначен для редактирования бинарных файлов. xxd
не добавляет байтов; он производит точный hexdump, который точно перевернут xxd -r
(если вы не испортили его).
Только для просмотра, вы можете просто запустить xxd
из скорлупы:
$ xxd binaryfile | vim - # just use vim as a reader
Я редактировал исполняемые файлы с vim -b
и фильтрация через xxd
и обратно через xxd -r
, Они бежали нормально.
Кроме того, xxd - это программа для Vim, которая поставляется с дистрибутивом Vim. Вам может быть полезно знать, od
например,
od -tx1 file
В бинарных файлах Windows (не уверен насчет других платформ), :%!xxd
помещает маркер конца файла в последние два байта (0x0d, 0x0a). По какой-то причине %!xxd -r
не удаляет их.
Я часто удаляю их вручную (просто удаляю оба символа, чем запускаю %!xxd -r
)
Может быть что-то, что может быть исправлено непосредственно с xxd
,