跳转到vim中的字节地址?

时间:2013-08-14 17:50:24

标签: vim binary 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:~$ 

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

3 个答案:

答案 0 :(得分:50)

是的,有。这是普通模式命令go

来自:h go

  

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

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

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

:exe 'normal! ' . str2nr('0x2a', 16) . 'go'
:exe 'goto' str2nr('0x2a', 16)

答案 1 :(得分:5)

虽然这个问题有其自身的优点,但我是否可以建议您使用hdgrep,Vim和shell的所有内容以相当迂回的方式完成这一切?

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

密钥位于:h 23.4,“二进制文件”:Vim可以是您的十六进制编辑器。

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

:%!xxd -g1<Enter>
/00 <Enter>
...
...
:%!xxd -r<Enter>

有关详细信息,请务必阅读:h hex-editing

答案 2 :(得分:3)

是的,使用:help starting.txt,您可以找到有关所有vim命令行参数的帮助。

使用上面几个给出的goto命令,你应该能够从命令行给vim一个命令转到字节偏移量,如

vim "+exe 'goto' str2nr('0x2a', 16)" file

您可以使用:help +byte_offset命令检查:ve处描述的编译时标志。我的Ubuntu版本默认编译它。