是否有一种巧妙的方法可以在Vim中将十六进制文件查看为二进制文件,然后将其从十六进制文件保存回二进制文件?
#1 楼
您可以使用xxd
命令将Vim中的文件转换为十六进制表示,执行以下操作::%!xxd
进入命令行模式,:
匹配整个文件作为范围,%
过滤器通过外部命令来确定范围,!
是外部外壳程序命令给出这样的输出,将其分成八位字节计数/行(每行八位字节可以通过
xxd
命令上的参数-c
进行更改) ,十六进制表示形式和文本表示形式:0000000: 5468 6973 2069 7320 6120 7465 7374 0a41 This is a test.A
0000010: 6e6f 7468 6572 206c 696e 650a 416e 6420 nother line.And
0000020: 7965 7420 616e 6f74 6865 720a yet another.
一旦进行了更改(在十六进制部分中),就可以使用xxd上的
xxd
命令返回到文本,因此-r
这有点基本,尽管我喜欢它的简单性并记住
:%!xxd -r
,这是一个有趣的命令行工具(我没有在十六进制上做很多工作)。您可以使用一些配方以更自动化的方式来处理此转换,如改进的十六进制编辑中所述。再记住,您还可以在以下命令中使用语法高亮在vim中进行十六进制编辑:
:set ft=xxd
#2 楼
取自:h hex-editing
:If one has a particular extension that one uses for binary files (such as exe,
bin, etc), you may find it helpful to automate the process with the following
bit of autocmds for your <.vimrc>. Change that "*.bin" to whatever
comma-separated list of extension(s) you find yourself wanting to edit:
" vim -b : edit binary using xxd-format!
augroup Binary
au!
au BufReadPre *.bin let &bin=1
au BufReadPost *.bin if &bin | %!xxd
au BufReadPost *.bin set ft=xxd | endif
au BufWritePre *.bin if &bin | %!xxd -r
au BufWritePre *.bin endif
au BufWritePost *.bin if &bin | %!xxd
au BufWritePost *.bin set nomod | endif
augroup END
您可能要看一下:如何导航到Vim文档中的主题?
评论
完美-我将其添加到〜/ .vim / plugin / binary.vim
–thom_nic
17年9月6日在15:55
也许这必须在〜/ .vim / ftdetect /中,因为这与文件类型检测有关?
– Vitaly Zdanevich
18年11月28日在7:36
评论
我认为值得一提的是,进行更改后,必须先返回到正常模式,然后再保存更改。
–卡普坦
18年7月26日在20:52
是否可以指定字节顺序?大端或小端
– Subin Sebastian
19年4月30日在9:23
顺便说一句。 :h for:%!在哪里?我只能找到:!。使用nvim。
– Artyom
20-05-18在7:55
信息:在文件中间更改了十六进制代码,并最终将其与“超越比较”进行比较之后,我发现vim在文件末尾添加了0A。因此,它现在具有不同的大小(+1字节)。我认为十六进制编辑器不应该这样做。我使用truncate --size = -1来更正此问题。
– mgutt
20-10-16在21:59
是否有插件或其他方式显示十六进制格式的字节和解码为ASCII的字节之间的连接?例如,当光标在字节54处时,它将突出显示T。类似于hexedit的方式。编辑:这个插件应该做。
–马特西亚斯·布劳恩(Matthias Braun)
20 Dec 16'20:27