跳转到vim中的字节地址?

Alo*_*dal 37 binary vim hexdump

我正在调查一个主要是UTF-8文件,其中有很多长行.但是,文件并不完全是文本文件,还有一些垃圾.为了找到我的兴趣点,我正在使用hdgrep.

所以在某些时候我知道它对例如0000301a感兴趣,所以我想在Vim中快速打开文件并跳转到那个位置.

示例(实际上是一个很小的文件,这里的位置是0000001c):

me@here:~$ hd file | grep -C 10 \ 00\ 
00000000  6c 69 6e 65 31 0a 6c 69  6e 65 32 0a 6c 69 6e 65  |line1.line2.line|
00000010  33 0a 6c 69 6e 65 34 0a  6c 69 6e 65 00 35 0a 6c  |3.line4.line.5.l|
00000020  69 6e 65 36 0a 6c 69 6e  65 37 0a 6c 69 6e 65 38  |ine6.line7.line8|
00000030  0a 6c 69 6e 65 39 0a 6c  69 6e 65 31 30 0a        |.line9.line10.|
0000003e
me@here:~$ 
Run Code Online (Sandbox Code Playgroud)

在Vim中有一个技巧可以跳转到字节位置吗?还是尽可能接近?

glt*_*lts 53

就在这里.这是普通模式命令go.

来自:h go:

[count] go         转到缓冲区中的{count}字节.

例如,42go跳转到字节42.

为了跳转到十六进制或八进制地址,您需要构造一个带:normal! go或等效的命令:goto,以及str2nr()或者printf()函数.

:exe 'normal! ' . str2nr('0x2a', 16) . 'go'
:exe 'goto' str2nr('0x2a', 16)
Run Code Online (Sandbox Code Playgroud)

  • 注意:Vim的字节位置是从1开始的(如列和行号),而不是从零开始. (5认同)

glt*_*lts 5

尽管这个问题有其自身的优点,我可能会建议你做这件事在一个相当迂回的方式,利用所有的hd,grep,Vim的,和外壳?

为什么不在整个过程中使用Vim和Vim?

关键是:h 23.4"二进制文件":Vim可以是你的十六进制编辑器.

使用您的文件启动Vim后vim -b myfile,工作流程变为:

:%!xxd -g1<Enter>
/00 <Enter>
...
...
:%!xxd -r<Enter>
Run Code Online (Sandbox Code Playgroud)

请务必阅读:h hex-editing以获取更多详细信息.