5

我正在编写一些代码来处理二进制数据流。它以字节数组表示的块的形式接收。结合起来,字节数组表示消息的顺序流,每个消息都以相同的常量终止符值(在我的例子中为 0xff)结束。但是,终止符值可以出现在任何给定数据块中的任何点。单个块可以包含消息的一部分、多条消息以及介于两者之间的任何内容。

以下是由此处理的数据的一小部分示例:

[0x00, 0x0a, 0xff, 0x01]
[0x01, 0x01]
[0xff, 0x01, 0xff]

此数据应转换为以下消息:

[0x00, 0x0a, 0xff]
[0x01, 0x01, 0x01, 0xff]
[0x01, 0xff]

我写了一个小班来处理这个问题。它有一种方法以字节数组格式添加一些数据,然后将其放入缓冲区数组中。当遇到终止符时,字节数组被清空,完整的消息被放入消息队列中,可以使用 hasNext() 和 next() 方法访问(类似于迭代器)。

这个解决方案运行良好,但是当我完成它时,我意识到在一个已建立的库中可能已经有一些稳定、高性能和经过测试的代码,我可以使用它们来代替。

所以我的问题是 - 你知道有这样一个类的实用程序库吗,或者标准 Java 6 库中的某些东西已经可以做到这一点?

4

1 回答 1

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]
于 2012-10-11T13:48:21.867 回答