2010-11-28 2 views
0

Я попытался найти ответ на этот вопрос, но сейчас 1 час ночи, и я немного устал.Как сканировать файл базы данных для шестнадцатеричной строки в Java

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

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

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

ответ

0

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

Вот пример наивной реализации, который будет собирать все последовательности байтов между 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; 
} 
Смежные вопросы