2012-10-11 5 views
5

バイナリデータのストリームを処理するコードを記述しています。バイト配列で表されるチャンクで受信されます。結合すると、バイト配列はメッセージの連続ストリームを表し、それぞれは同じ定数ターミネーター値(私の場合は0xff)で終わります。ただし、ターミネータ値は、任意のデータチャンクの任意のポイントに表示できます。 1つのチャンクには、メッセージの一部、複数のメッセージなどが含まれています。このデータは、これらのメッセージに変換する必要がありますJavaでバイナリデータをトークン化

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

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

私が処理するために、小さなクラスを書かれている。ここ

は、このことにより、扱うデータがどのように見えるかの小さなサンプルですこの。いくつかのデータをバイト配列形式で追加し、それをバッファ配列に配置する方法があります。ターミネータ文字に遭遇すると、バイト配列がクリアされ、メッセージ全体がメッセージキューに置かれます。メッセージキューには、hasNext()メソッドとnext()メソッド(イテレータと同様)を使用してアクセスできます。

この解決策はうまくいきますが、私がそれを終えたとき、代わりに使用できる確立されたライブラリに安定した、パフォーマンスの良い、テスト済みのコードがすでに存在する可能性があることに気付きました。

私の質問です。あなたはそのようなクラスを持つユーティリティライブラリを知っていますか、それとも既にこれを行うことができる標準のJava 6ライブラリに何かがありますか?

+0

(byte) 0xFF == -1として。バッファリングされたバイトストリームの子クラスを使うことができます。これは '0xff'のバイトごとのテストを行うことができます。場合によっては、パイプラインを利用できます。[PipedInputStream](http://docs.oracle.com/javase/6/docs/api/java/io/PipedInputStream.html)などを参照してください。 –

答えて

1

フレームワークが必要ないと思うのですが、カスタムパーサーは十分簡単です。バイト配列には、検索および操作は、私は時々、Javaで欠場ものです

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(); 
    } 
} 

プリント

[0, 10, -1] 
[1, 1, 1, -1] 
[1, -1] 
+0

応答をありがとう。それは私が持っているものより有望で確かによりエレガントに見えますが、私が持っているデータは、あなたが与えた例のように1バイト配列ではなく、別々のバイト配列として来ます。 – Sevas

+0

「byte []」はどこから来ますか?あなたはデバイスやネットワークから読んでいますか? –

+0

実際にシリアルポートから読み込まれるので、データは一連のバイト配列のように見えます – Sevas

関連する問題