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,

Другие вопросы по тегам