我正在寻找一种搜索一系列十六进制数字的文本表示的方法。我搜索二进制文件的十六进制转储。
0x000001A0: 36 5B 09 76 99 31 55 09 78 99 34 51 49 BF E0 03
0x000001B0: 28 0B 0A 03 0B E0 07 28 0B 0A 03 0B 49 58 09 35
问题是模式可能会翻到下一行。例如,在上面的两行中,我无法立即搜索03 28 0B
,因为它位于两行。
我从最近的帖子中得知,正则表达式是可行的,但我不熟悉它并且不知道该使用什么:Notepad ++,Vim,Word或其他任何东西。
编辑1 显示上述内容的文本文件来自二进制文件,我可以使用Notepad ++。
编辑2 例如,我想尽可能接近11:45:00(军事时间)。分散在上面两行的03 28 0B 0A 03 0B
可以读作“2011年3月10日的3秒,40分钟,11小时”。我正在查看这个文件,看看我能到达11:45:00的距离。
答案 0 :(得分:1)
好吧,似乎没有一个更优雅的解决方案适合你,所以:
\v03(\n[^:]+:)? 28(\n[^:]+:)? 0B(\n[^:]+:)?
是的,它是复制粘贴和超级暴力的,但如果我能让friggin反向引用工作,它看起来会好得多。
只需键入'/'然后复制该模式并按Enter键,将03 28 0B替换为您需要的任何内容,后跟空格,新值,然后是括号语句。有大约100%的机会有更好的东西,但我想不到它。
这也会匹配内存位置,但如果你想做的就是看一眼就不重要了。
编辑:忘记了\ v
答案 1 :(得分:0)
您可以使用具有内置HEX编辑器和HEX搜索功能的PSPad。只需打开原始二进制文件,切换到HEX编辑器并搜索序列。
答案 2 :(得分:0)
让我提出以下映射,其中包含多个十六进制数字 用户输入或视觉选择,创建适当的模式并运行搜索 它
nnoremap <silent> <expr> <leader>x/ SearchHexBytes('/', 0)
nnoremap <silent> <expr> <leader>x? SearchHexBytes('?', 0)
vnoremap <silent> <leader>x/ :call SearchHexBytes('/', 1)<cr>/<cr>
vnoremap <silent> <leader>x? :call SearchHexBytes('?', 1)<cr>?<cr>
function! SearchHexBytes(dir, vis)
if a:vis
let [qr, qt] = [getreg('"'), getregtype('"')]
norm! gvy
let s = @"
call setreg('"', qr, qt)
else
call inputsave()
let s = input(a:dir)
call inputrestore()
endif
if s =~ "[^ \t0-9A-Fa-f]"
echohl Error | echomsg 'Invalid hex digits' | echohl None
return
endif
let @/ = join(split(s, '\s\+'), '\%(\s*\|\n0x\x\+:\s*\)')
return a:dir . "\r"
endfunction