2011-02-25 31 views
1

我正在尋找一種方法在java中從輸入流中提取某些字節。 例如 我將有該流數據發生的文化我將如何從java中的InputStream提取某些模式,然後放入一個byteArray

0x01,0x02,0x00,0x01,0x00,0x01,0x03,0x04,0x00,0x01,0x09,0x08,0x00,0x01,0x00,0x01 

我的編碼方案是鍵入結束 首先,我將檢查的第一個字節的數據, 然後我會希望所有的數據存儲在從字節數組0×01,直到的0x00,0x01,0x00,0x01的次數除0x01

所以第一塊數據,我將放入數組

0x01,0x02,0x00,0x00 

,然後到下一個, 它以一個0x030x00,0x01,0x00,0x01 我想爲這個被放置在另一個字節數組,

0x03,0x04,0x00,0x01,0x09,0x08,0x00,0x00 

結束如何,我會去這樣做,我開始使用

一個ByteArrayOutputStream動態地添加到字節數組,而無需知道該大小, 但林失去了關於如何將提取出的每個圖案和刪除每個0×01之後的0×00的邏輯, 也爲Im rading一個字節從一個輸入流中,一次一個字節(它的只有這樣我可以得到字節)

+1

評論請添加一些結構和格式的問題(例如代碼塊,第代替單個線)。在目前的狀態,我不願意看它更接近 – 2011-02-25 17:37:41

+0

沒問題,爲你做了,如果你還有其他東西讓我知道 – molleman 2011-02-25 17:44:28

回答

3

您需要一個有限狀態識別器。通過一次讀取的字節一個

state = 0; 
while((byte=input.read()) != EOF) 
{ 
    switch(state) 
    { 
     case 0:  // "normal" state 
      if (byte == 0x00) 
      { 
       state = 1; 
       buf.append(byte); 
      } 
      else 
       output.write(byte) 
      break; 
     case 1:  // We've seen a 0x00 
      if (byte == 0x00) 
      { 
       state = 1; 
       output.write(buf); 
      } 
      else if (byte == 0x01) 
      { 
       state = 2; 
       buf.append(byte); 
      } 
      else 
      { 
       output.write(buf); 
       buf.clear(); 
       state = 0; 
      } 
      break; 
     case 2:  // We've seen 0x00,0x01 
      if (byte == 0x00) 
      { 
       state = 3; 
       buf.append(byte); 
      } 
      else if (byte == 0x01) 
      { 
       output.write(0x00); 
       buf.clear(); 
       state = 0; 
      } 
      else 
      { 
       output.write(buf); 
       buf.clear(); 
       state = 0; 
      } 
      break; 
     case 3:  // We've seen 0x00,0x01,0x00 
      if (byte == 0x00) 
      { 
       state = 1; 
       output.write(buf); 
       buf.clear(); 
       buf.append(byte); 
      } 
      else if (byte == 0x01) 
      { 
       // The last four input bytes were 0x00,0x01,0x00,0x01 
       state = 0; 
       output.write(0x00,0x00); 
       buf.clear 
      } 
      else 
      { 
       output.write(buf); 
       buf.clear(); 
       state = 0; 
      } 
      break; 
    } 
} 
if (!buf.empty()) output.write(buf); 

這工作:爲您簡單的語法如下僞代碼應該做的伎倆。

如果它檢測到0x00,我們需要開始查找分隔符模式,但保存字節以防萬一以後我們發現它是虛警。 「狀態」變量跟蹤我們到目前爲止所看到的內容。在每一點,如果輸入與下一個預期的分隔符字節相匹配,我們將其保存起來,並且繼續前進。如果在任何時候我們沒有得到下一個預期的分隔符字節,我們只需寫出所有保存的數據,清除緩衝區並返回到「正常」狀態。但是,如果我們最終看到整個分隔符字符串,則我們寫出0x00,0x00並丟棄保存的字節(這將是0x00,0x01,0x00,0x01)。

EDIT:代碼修改爲從OP處理附加條件和從@Shaded

+0

EOF =文件結束,我將使用網絡連接,我將如何確定沒有更多的字節被髮送? ,謝謝你的回答,我會看看如果我能以某種方式實現它併發布代碼,歡呼 – molleman 2011-02-25 17:56:07

+0

你必須調整這個僞代碼到你的特定輸入和輸出機制。您可能沒有文件結束,而是「連接關閉」。 – 2011-02-25 17:59:03

+0

是的,如果沒有更高層次的抽象,狀態機就是要走的路(或者創建它們的東西)。它可能會簡化代碼來爲狀態創建符號常量。 – StaxMan 2011-02-25 18:14:41

相關問題