如何在Netty JAVA中从连续缓冲区/字节数组中获取特定的字符串模式?
我目前正在使用Netty。现在的问题是,我想从缓冲区中检索一个特定的字符串。例如,如果缓冲区数据如下所示:如何在Netty JAVA中从连续缓冲区/字节数组中获取特定的字符串模式?,java,buffer,netty,quickfix,Java,Buffer,Netty,Quickfix,我目前正在使用Netty。现在的问题是,我想从缓冲区中检索一个特定的字符串。例如,如果缓冲区数据如下所示: 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=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。要从ByteBuf中获取字符串,请使用:ByteBuf.toString(Charset)。是的,非常感谢。请帮我解决这个问题。