如果在Vim中使用xxd,是否可以修改文件?

7
我正在尝试理解ID3标签的工作原理。在阅读了一些文档后,我开始查看一些mp3文件的原始数据。 Vim通常是我的首选编辑器,所以经过一番搜索,我发现可以使用xxd来调用我的文件的十六进制表示形式。
:%!xxd  

一切正常,但当我按照顺序放回每件东西时,出现了问题。
:%!xxd -r  

当我退出时,我发现文件已经被修改了;vlc无法再播放它,diff告诉我文件有差异。我以为我不小心修改了什么东西,但进一步的实验表明,即使打开文件并使用xxd,然后再使用xxd -r也会改变文件。

为什么会这样?我该如何防止它发生?我做错了什么吗?


根据xxd手册的示例,为了将所有编辑后的字节转储到另一个文件中(并避免破坏原始文件),你需要在vim命令中指定文件路径,例如::%!xxd -r > /path/to/new/file - Ham
3个回答

10

显然,如果您不打算对文件进行更改,您可以使用:q!命令退出vim

正如@RunHolt所指出的那样,vimxxd可以更改二进制文件。例如:将LF更改为CRLF或在文件末尾添加一个LF字符。

您可以通过设置binary选项来防止这种情况:

要么以以下方式启动vimvim -b filename,要么在将文件加载到缓冲区之前输入:set binary命令。


通过使用二进制选项,一切都正常工作了。是的,我知道我可以使用:q!来退出,但主要想法是能够通过vim修改文件,所以我必须找到一个必要时保存文件的方法。非常感谢! - gcali
1
@Odexios:不用谢。我也许不该提到:q!命令,但是你永远不知道,有时候最明显的事情却是最难找到的。 - heijp06

2
您可能没有使用 vim -b 将文件作为二进制文件加载。也就是说,损坏已经发生了。
这里的 xxd 是一个误导。xxd 后跟 xxd -r 是透明的。它用于编辑二进制文件。 xxd 不会添加任何字节;它生成准确的十六进制转储,可以通过 xxd -r 准确地反转(除非您损坏了它)。
仅用于查看,您可以从 shell 中运行 xxd
$ xxd binaryfile | vim -     # just use vim as a reader 

我用 vim -b 编辑可执行文件,通过 xxd 过滤并再次通过 xxd -r 转换。它们可以正常运行。
此外,xxd 是随 Vim 发行的 Vim 特定程序。你可能会发现了解 od 很有用。
od -tx1 file

不知道!此外,在文件已经打开之后(在xxd之前),您可以进行set bin设置。 - RunHolt

2
在Windows二进制文件(不确定其他平台)中,:%!xxd 将文件结束标记放在最后两个字节(0x0d,0x0a)。由于某种原因,%!xxd -r 不能删除它们。
我经常手动删除它们(只需删除这两个字符,然后运行%!xxd -r )。
可能有一些可以直接使用xxd修复的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接