Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Netty JAVA中从连续缓冲区/字节数组中获取特定的字符串模式?_Java_Buffer_Netty_Quickfix - Fatal编程技术网

如何在Netty JAVA中从连续缓冲区/字节数组中获取特定的字符串模式?

如何在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”结尾的字符串。您可以清楚地看到,缓冲区中追加了两个字符串。请注意,上面的数据位于字节数组中。所以,有时我会得到精确的字符串,有

我目前正在使用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=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)。是的,非常感谢。请帮我解决这个问题。