【问题标题】:Jump to byte address in vim?跳转到vim中的字节地址?
【发布时间】:2013-08-14 17:50:23
【问题描述】:

我正在调查一个主要是 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 中是否有跳转到字节位置的技巧?还是尽可能靠近?

【问题讨论】:

  • 不确定这是否适用于您的情况,但您是否尝试过将偏移量转换为十进制然后使用:goto 1234
  • 顺便说一句,您不必使用十六进制编号,您可以随意格式化高清输出。查看手册页。

标签: vim binary hexdump


【解决方案1】:

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

来自:h go

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

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

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

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

【讨论】:

  • 但请注意:Vim 的字节位置是从 1 开始的(如列号和行号),而不是从零开始的。
【解决方案2】:

虽然这个问题有其自身的优点,但我是否可以建议您以一种相当迂回的方式来做这整个事情,使用所有 hdgrep、Vim 和 shell?

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

密钥在:h 23.4,“二进制文件”:Vim 可以成为你的十六进制编辑器。

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

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

请务必阅读:h hex-editing,了解更多详情。

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • vim --version | grep byte_offset 并查找+- 通常比扫描:version 更快
    • 虽然:echo has("byte_offset") 更快。只需检查输出是否为 1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 2013-08-26
    • 2021-06-21
    相关资源
    最近更新 更多