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

标签 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=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 使用的编码进行更改

关于java - 如何从Netty JAVA中的连续缓冲区/字节数组中获取特定的字符串模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45615733/

相关文章:

java - 如何使用netty写一个http代理

java - Android Studio - 编译 OpenCV 时错误找不到符号类 R

c++ - 使用 cout 时输出缓冲区是否自动刷新?

ios6 - AVQueuePlayer 挫败感(缓冲区欠载处理)

java - 何时使用缓冲区以及有何用途

java - Applet + Netty 4.0 异常初始化错误

java - 运行 Java 代码时 Eclipse 中的 StackOverflowError

java - 为什么访问规则不适用于非根组?

java - 为什么 classpath=/tomcat_lib/不起作用

java - ConcurrentHashMap 上的 Netty ChannelGroup