Vim изменяет файл, если используется с xxd - PullRequest
4 голосов
/ 27 марта 2012

Я пытаюсь понять, как работают теги ID3, поэтому, прочитав некоторую документацию, я начал просматривать некоторые необработанные данные mp3.Обычно Vim - мой предпочтительный редактор, поэтому после некоторого поиска в Google я обнаружил, что могу использовать xxd для просмотра шестнадцатеричного представления моих файлов, вызывая

:%!xxd  

Все работает нормально, но когда я возвращаю все обратнос

:%!xxd -r  

и выходом я обнаружил, что файл был изменен;VLC больше не мог воспроизводить его, и diff сказал мне, что файлы отличаются.Я думал, что я что-то изменил случайно, но дальнейшие эксперименты показали, что даже открытие файла и использование xxd, а затем xxd -r изменяет файл.

Почему это?Как я могу предотвратить это?Я что-то не так делаю?

Ответы [ 3 ]

7 голосов
/ 27 марта 2012

Очевидно, что если вы не собираетесь что-либо менять в файле, вы можете выйти из vim, используя :q!.

Как указывает @RunHolt, vim и xxd могут изменять двоичный файл. например изменение LF на CRLF или добавление символа LF в конец файла.

Вы можете предотвратить это, установив параметр binary:

Либо запустите vim как: vim -b filename, либо введите :set binary перед загрузкой файла в буфер.

2 голосов
/ 28 марта 2012

Возможно, вы не загрузили файл как двоичный файл с 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
1 голос
/ 27 марта 2012

В двоичных файлах Windows (не уверен в других платформах), :%!xxd помещает маркер конца файла в последние два байта (0x0d, 0x0a). По какой-то причине %!xxd -r не удаляет их.

Я часто удаляю их вручную (просто удаляю оба символа, чем запускаю %!xxd -r)

Может быть что-то, что можно исправить напрямую с помощью xxd.

...