Поиск с использованием регулярных выражений в Vim или в другом месте - PullRequest
2 голосов
/ 21 июня 2011

Я ищу способ поиска текстового представления серии шестнадцатеричных чисел. Я ищу в шестнадцатеричном дампе двоичного файла.

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, разбросанные по двум строкам выше, можно прочитать как «3 секунды 40 минут 11 часов 10 марта 2011 года». Я пытаюсь просмотреть этот файл и посмотреть, как близко я могу добраться до 11: 45: 00.

Ответы [ 3 ]

1 голос
/ 21 июня 2011

Что ж, похоже, ни одно из более элегантных решений не сработало для вас, поэтому вот:

\v03(\n[^:]+:)? 28(\n[^:]+:)? 0B(\n[^:]+:)?

Да, это скопированная копия и супер грубая форси, но было бы намного лучше, если бы я мог заставить работать чертовы обратные ссылки.

Просто введите '/', затем скопируйте этот шаблон и нажмите ввод, замените 03 28 0B на все, что вам нужно, затем пробел, новое значение, затем оператор в скобках. Есть примерно 100% шанс, что что-то лучше, но я не могу думать об этом.

Это также будет соответствовать расположению памяти, но это не должно иметь значения, если все, что вы хотите сделать, это взглянуть.

Редактировать: Забыли про \ v

0 голосов
/ 21 июня 2011

Позвольте мне предложить следующие сопоставления, которые берут количество шестнадцатеричных цифр из пользовательский ввод или визуальный выбор, создать соответствующий шаблон и запустить поиск это.

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
0 голосов
/ 21 июня 2011

Вы можете использовать PSPad , который имеет встроенный редактор HEX и поиск HEX.Просто откройте исходный двоичный файл, переключитесь в HEX Editor и найдите свою последовательность.

...