5

バイナリ データのストリームを処理するコードを書いています。バイト配列で表されるチャンクで受信されます。組み合わせると、バイト配列はメッセージの連続したストリームを表し、それぞれが同じ定数ターミネータ値 (私の場合は 0xff) で終わります。ただし、ターミネータ値は、任意のデータ チャンク内の任意のポイントに表示できます。1 つのチャンクには、メッセージの一部、複数のメッセージ、およびその間のあらゆるメッセージを含めることができます。

これによって処理されるデータの小さなサンプルを次に示します。

[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 に答える