Как сканировать файл базы данных на наличие шестнадцатеричной строки в Java - PullRequest
0 голосов
/ 28 ноября 2010

Я пытался найти ответ на этот вопрос, но сейчас час ночи, и я немного устал.

Может ли кто-нибудь указать мне правильное направление, пожалуйста, я хочу отсканировать файл с использованием Java (файл базы данных .wmdb) на наличие шаблона шестнадцатеричных значений, а затем извлечь шестнадцатеричное значение после этого шаблона.

например 1. Сканирование для шестнадцатеричного значения "6B 4A 80 10 00 00 00 00 00" 2. Извлекайте шестнадцатеричные значения, пока сканер не достигнет значения «00 00 28». 3. Повторите

Я уверен, что есть простой способ, который я пропустил, используя бинарный ввод-вывод, но я просто не могу решить это. Хотя я не после ответа, удар в правильном направлении или простой пример мне очень помог бы.

1 Ответ

0 голосов
/ 28 ноября 2010

Вы правы, есть простой способ сделать это. Просто преобразуйте представление начала и конца матча в последовательности byte s. Затем найдите начальную последовательность в java.io.InputStream и извлеките значения до совпадения конца. Для сопоставления вы можете использовать один из известных алгоритмов .

Вот пример простой реализации, которая соберет все последовательности байтов между beginMatch и endMatch:

public ArrayList<ArrayList<Integer>> pullOutBytes(InputStream stream, ArrayList<Integer> beginMatch, ArrayList<Integer> endMatch)
        throws IOException {
    ArrayList<ArrayList<Integer>> pulledOut = new ArrayList<ArrayList<Integer>>();
    int b;
    BeginSearch:
    while ((b = stream.read()) != -1) {
        int beginMatchIndex = 0;
        if (b != beginMatch.get(beginMatchIndex)) {
            continue BeginSearch;
        }
        beginMatchIndex++;
        while ((b = stream.read()) != -1 && beginMatchIndex < beginMatch.size()) {
            if (b != beginMatch.get(beginMatchIndex)) {
                continue BeginSearch;
            }
            beginMatchIndex++;
        }
        if (beginMatchIndex < beginMatch.size()) {
            break;
        }
        int endMatchIndex = 0;
        ArrayList<Integer> pull = new ArrayList<Integer>();
        pull.add(b);
        while ((b = stream.read()) != -1) {
            pull.add(b);
            if (b == endMatch.get(endMatchIndex)) {
                if (++endMatchIndex == (endMatch.size() - 1)) {
                    while (endMatchIndex > 0) {
                        pull.remove(pull.size() - 1);
                        endMatchIndex--;
                    }
                    pulledOut.add(pull);
                    continue BeginSearch;
                }
            }
        }
    }
    return pulledOut;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...