如何从Netty JAVA中的连续缓冲区/字节数组中获取特定的字符串模式?
问题描述:
我目前使用的是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类,它只是简单地检查指定的分隔符并将字符串提供给我们。以同样的方式,我该如何做到这一点?
答
我的建议是翻译的缓冲区,并使用正则表达式来匹配你的目标字符串:
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使用
请注意使用'bb.array()'只在'bb.hasArray()'返回true时保存。并且还需要考虑'bb.arrayOffset()'。 –
谢谢。但是因为我在这里使用Netty,所以我会在这里获得ByteBuf而不是ByteBuffer。 –
在netty use:ByteBuf.toString(Charset)中获取ByteBuf中的字符串。 –