0

エンコードされたタグを検索し、それらによって識別されたデータを取得するために必要なファイルがあります。タグは4バイトの長さで、可変長のASCII文字列またはリトルエンディアンでエンコードされた2バイト整数値のいずれかを識別します。

タグはすべて4バイト境界にあり、ファイルの先頭から最初の2000バイト以内にあるように見えます。私はファイルを検索するさまざまな方法を試しました。動作したのは、10進整数値を使用したバイトごとの比較だけです。

SOで見つかった解決策の1つですが、この問題に対して正確に提案されたわけではありません:indexOfSubList()。このテストを試しましたが、結果は-1です。

byte[] needle = {68,73,67,77};
byte[] hayStack = {00, 01, 68,73,67,77, 11, 45};
location = Collections.indexOfSubList(Arrays.asList(hayStack), Arrays.asList(needle));

私は決してこのコードに夢中になっているわけではなく、他の考えや解決策をいただければ幸いです。

4

2 に答える 2

2

あなたの質問はちょっとあいまいです、あなたはこのようなことを意味しますか:

// simplified way of identifying tag by first byte of it,
// make it more complex as needed
byte startOfTag = 65;

// for loop assumes tags start at even 4 byte boundary, if not, modify loop
for(int i = 0; i <= data.length-4 ; i += 4) {
    if (data[i] == startOfTag) {
        myTagHandlerMethod(data[i], data[i+1], data[i+2], data[i+3]);
    }
}

は に対して期待どおりに動作しないCollections.indexOfSubListため、 から-1を取得します。コンテナーにはオブジェクト参照が含まれている必要があり、ボックス化されていない数値型は許可されていません...これは機能するはずです:Arrays.asListbyte[]List<byte[]>List<Byte>

Byte[] needle = {68,73,67,77};
Byte[] hayStack = {00, 01, 68,73,67,77, 11, 45};
location = Collections.indexOfSubList(Arrays.asList(hayStack), Arrays.asList(needle));

プリミティブ型の配列を操作する際に車輪の再発明を避けたい場合は、Google の Guava libsを使用できます。たとえば、indexOfここで使用できるメソッドがあります。

于 2013-03-11T14:59:38.293 に答える
1

byte配列を配列に変換することByteで、希望する結果が得られます。

Byte[] needle = { 68, 73, 67, 77 };
Byte[] hayStack = { 00, 01, 68, 73, 67, 77, 11, 45 };
location = Collections.indexOfSubList(Arrays.asList(hayStack),
    Arrays.asList(needle));

// location now equals 2

これは、オブジェクトArrays.asListで想像するように動作しないためです。ではなくbyte[]を返します。List<byte[]>List<Byte>

于 2013-03-11T14:55:03.750 に答える