我正在编写一些代码来处理二进制数据流。它以字节数组表示的块接收。结合起来,字节数组表示连续的消息流,每个消息都以相同的常量终结符值结束(在我的情况下为0xff)。但是,终结符值可以出现在任何给定数据块的任何位置。单个块可以包含消息的一部分,多个消息以及其间的任何内容。
以下是对此处理数据的一小部分:
[0x00, 0x0a, 0xff, 0x01]
[0x01, 0x01]
[0xff, 0x01, 0xff]
此数据应转换为以下消息:
[0x00, 0x0a, 0xff]
[0x01, 0x01, 0x01, 0xff]
[0x01, 0xff]
我写了一个小班来处理这个问题。它有一种方法以字节数组格式添加一些数据,然后将其放在缓冲区数组中。遇到终结符时,将清除字节数组,并将完整的消息放入消息队列中,可以使用hasNext()和next()方法(类似于迭代器)进行访问。
这个解决方案工作正常,但是当我完成它时,我意识到在我建立的库中可能已经存在一些稳定,高性能和经过测试的代码,而不是我可以使用它。
所以我的问题是 - 你知道一个实用程序库会有这样一个类,或者标准Java 6库中有什么东西可以做到这一点吗?
答案 0 :(得分:1)
我不认为你需要一个框架,因为自定义解析器很简单。
InputStream in = new ByteArrayInputStream(new byte[]{
0x00, 0x0a, (byte) 0xff,
0x01, 0x01, 0x01, (byte) 0xff,
0x01, (byte) 0xff});
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for (int b; (b = in.read()) >= 0; ) {
baos.write(b);
if (b == 0xff) {
byte[] bytes = baos.toByteArray();
System.out.println(Arrays.toString(bytes));
baos = new ByteArrayOutputStream();
}
}
打印为(byte) 0xFF == -1
[0, 10, -1]
[1, 1, 1, -1]
[1, -1]