3

BitSet を複数の BitSet に変換し、次にそれらを複数のバイト配列に変換することを目的とした小さな Java プロジェクトに取り組んでいます。

たとえば、BitSet を 2 つの部分に分割し、各部分を int に変換したいと考えています。

    byte[] bytesToBeConverted = {(byte)0x05, (byte)0x00};
    BitSet bitSetToBeConverted = BitSet.valueOf(bytesToBeConverted);

BitSet BitSetPart1 =new BitSet(8);
BitSetPart1=bitSetToBeConverted.get(0,8);
int intPart1 = (int)(BitSetPart1.toByteArray()[0]); //intPart1 ==5

BitSet BitSetPart2 =new BitSet(8);
BitSetPart2 = bitSetToBeConverted.get(8,16);
int intPart2 = (int)(BitSetPart2.toByteArray()[0]); //intPart2 == 0 is wanted

最初の部分 (bitSetPart1 を intPart1 に変換する) では問題は発生しませんが、BitSetpart2 を false で初期化する必要がある 2 番目の部分では、メソッド toByteArray() :java.lang の結果にアクセスするときに例外が発生します。その場合、.ArrayIndexOutOfBoundsException toByteArray は null を返すようです。

それは、ゼロがそのタイプの操作の禁止値であることを意味しますか? その場合、BitSet クラスを拡張して toByteArray() メソッドをオーバーライドしますか? または、その問題を克服するための追加のメソッドを使用して、BitSet から完全に分離されたクラスを作成しますか?

または、私が言及していないその種の操作を実行する別の方法はありますか?

ご回答ありがとうございます。

4

2 に答える 2

3

のJavadocからtoByteArray()

より正確には、

byte[] bytes = s.toByteArray(); 

それから

bytes.length == (s.length()+7)/8

およびのJavadocからlength()

このビットセットの「論理サイズ」を返します。ビットセットの最上位セットビットのインデックスに1を加えたものです。BitSetに設定ビットが含まれていない場合はゼロを返します。

2番目BitSetのビットには設定ビットが含まれていないため、Javadocで明確に指定されているように、長さゼロの配列が返されます。

toByteArray()outの結果を指定されたバイト数にパディングする場合は、を使用しますArrays.copyOf(bitSet.toByteArray(), desiredLength)

于 2012-06-26T14:33:30.267 に答える
0

空のビットセットは空の配列を返すため、取得[0]は実際には違法です。

試す

BitSetPart2 = bitSetToBeConverted.get(8,16);
byte[] temp = BitSetPart2.toByteArray();
int intPart2 = temp.length == 0 ? 0 : (int)(temp[0]); 

代わりは

于 2012-06-26T14:32:53.590 に答える