在Java中对二进制数据进行标记

时间:2012-10-11 13:36:03

标签: java binary

我正在编写一些代码来处理二进制数据流。它以字节数组表示的块接收。结合起来,字节数组表示连续的消息流,每个消息都以相同的常量终结符值结束(在我的情况下为0xff)。但是,终结符值可以出现在任何给定数据块的任何位置。单个块可以包含消息的一部分,多个消息以及其间的任何内容。

以下是对此处理数据的一小部分:

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

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

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

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

这个解决方案工作正常,但是当我完成它时,我意识到在我建立的库中可能已经存在一些稳定,高性能和经过测试的代码,而不是我可以使用它。

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

1 个答案:

答案 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]