2017-08-10 25 views
1

我目前使用的是Netty。現在的問題是,我想從緩衝區中檢索一個特定的字符串。例如,如果緩衝器中的數據如下:如何從Netty JAVA中的連續緩衝區/字節數組中獲取特定的字符串模式?

8=FIX.4.2|9=00815|35=W|49=TT_PRICE|56=SAP0094X|10=134|8=FIX.4.2|9=00816|35=W49=TT_PRICE|56=SAP0094X|10=121 

現在我想要開始的字符串用「8 = XXX」,並用「10 = XXX」的結局。您可以清楚地看到,我們在緩衝區中添加了兩個字符串。請注意,上述數據是在一個字節數組中。所以,有時我會得到確切的字符串,並且有時候我會得到字符串,並且會追加另一半的完整字符串。我想要的是,我怎樣才能得到從「8 = xxx」到「10 = xxx」的字符串。我在Netty中看到了DelimiterBasedFrameDecoder類,它只是簡單地檢查指定的分隔符並將字符串提供給我們。以同樣的方式,我該如何做到這一點?

回答

2

我的建議是翻譯的緩衝區,並使用正則表達式來匹配你的目標字符串:

ByteBuffer bb = /* byte buffer */ 
String text = new String(bb.array(), 0, bb.position(), bb.remaing(), Charset.defaultCharset()); 

// I assume that this is the string: "8=FIX.4.2|9=00815|35=W|49=TT_PRICE|56=SAP0094X|10=134|8=FIX.4.2|9=00816|35=W49=TT_PRICE|56=SAP0094X|10=121" 

// If you need info on the regex just ask for it 
Pattern r = Pattern.compile("(8=\\w\\w\\w)[\\s\\S]*?(10=\\w\\w\\w)"); 
Matcher m = r.matcher(text); 

while (m.find()) { 
    System.out.println(m.group()); 
} 

注意Charset.defaultCharset()可以改變的基礎上,爲哪種編碼您的ByteArray使用

+0

請注意使用'bb.array()'只在'bb.hasArray()'返回true時保存。並且還需要考慮'bb.arrayOffset()'。 –

+0

謝謝。但是因爲我在這裏使用Netty,所以我會在這裏獲得ByteBuf而不是ByteBuffer。 –

+0

在netty use:ByteBuf.toString(Charset)中獲取ByteBuf中的字符串。 –

相關問題