2016-01-12 3 views
1

Я читаю поток данных из сокета tcp. Все эти данные отправляются в массив байтов:Каков наиболее эффективный способ захвата определенного байта байтов в потоке?

DataInputStream in = new DataInputStream(mysource.getInputStream()); 
FileOutputStream output = new FileOutputStream(path); 
int len; 
byte buffer[] = new byte [8192]; 

while(len = in.read(buffer)) !=-1){ 
    output.write(buffer); 
} 

output.close(); 

Поскольку поток читается, я хотел бы обнаружить конкретный 4 байта Patern, который повторяется в случайном порядке.

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

Есть ли способ сделать это в режиме реального времени?

ответ

0
/** 
* Knuth-Morris-Pratt Algorithm for Pattern Matching 
*/ 
class KMPMatch { 
    /** 
    * Finds the first occurrence of the pattern in the text. 
    */ 
    public int indexOf(byte[] data, byte[] pattern) { 
     int[] failure = computeFailure(pattern); 

     int j = 0; 
     if (data.length == 0) return -1; 

     for (int i = 0; i < data.length; i++) { 
      while (j > 0 && pattern[j] != data[i]) { 
       j = failure[j - 1]; 
      } 
      if (pattern[j] == data[i]) { j++; } 
      if (j == pattern.length) { 
       return i - pattern.length + 1; 
      } 
     } 
     return -1; 
    } 

    /** 
    * Computes the failure function using a boot-strapping process, 
    * where the pattern is matched against itself. 
    */ 
    private int[] computeFailure(byte[] pattern) { 
     int[] failure = new int[pattern.length]; 

     int j = 0; 
     for (int i = 1; i < pattern.length; i++) { 
      while (j > 0 && pattern[j] != pattern[i]) { 
       j = failure[j - 1]; 
      } 
      if (pattern[j] == pattern[i]) { 
       j++; 
      } 
      failure[i] = j; 
     } 

     return failure; 
    } 
} 

Отсюда: Searching for a sequence of Bytes in a Binary File with Java

Смежные вопросы