2012-05-07 32 views
0

假設我從網絡中按以下順序得到一個字節序列: XXXX = XXXX = XXXX = ...依此類推 您可以立即注意到模式(消息是一個由5個字節組成的序列:「XXXX =
X可以是任意數量的不同之處字節序列幀

現在,傳輸週期性地出現‘=’當然) 在一些點我的應用程序開始並獲得字節序列

什麼是獲取這些字節並將它們組幀爲5字節的最佳算法?
有兩個問題:
1.您如何找到第一條消息?我想我需要刪除一些字節,直到我得到'='對嗎?
2.應用程序如何設想處理暫停轉換和新開始

+0

缺少大量的信息。什麼是生成輸入?它可以有起始字節序列嗎?它是否被終止?你如何確定何時停止閱讀?一個新的開始需要什麼(清除一個緩衝區並重新開始閱讀)? – adu

+0

如果您不是簡單化,而且確實一次只能處理5個字節,您可以嘗試第一幀的所有5個可能的幀位置,並丟棄失敗的幀(當然,如果幀大小太大大)。要處理暫停並重新啓動,只要檢測到不匹配,就可以重新啓動進程。 – trutheality

回答

0

最簡單的方法是使用阻塞讀取(這是最常用的,因爲它是最簡單的)一次讀取5個字節。

通常情況下,你不會假設你在開始時有垃圾數據,只是讀取所有內容。如果你有頭,我也會讀。

DataInputStream dis = new DataInputStream(socket stream); 
byte[] bytes = new byte[5]; 

int sep; 
do { 
    dis.readFully(bytes); 
    process(bytes); 
} while((sep = dis.read()) == '='); 
if (sep > 0) 
    System.err.println("Unexpected character "+ (char) sep));