14

BitSetをByte配列に変換するこの例を取り上げました。

public static byte[] toByteArray(BitSet bits) {
    byte[] bytes = new byte[bits.length()/8+1];
    for (int i=0; i<bits.length(); i++) {
        if (bits.get(i)) {
            bytes[bytes.length-i/8-1] |= 1<<(i%8);
        }
    }
    return bytes;
}

しかし、ディスカッションフォーラムでは、計算ごとに1ビットが失われるため、この方法ではすべてのビットを取得できないことがわかりました。これは本当ですか?上記の方法を変更する必要がありますか?

4

4 に答える 4

15

いいえ、それで結構です。投稿へのコメントは、投稿内ののコードに関連しており、バイト配列からに変換されていましたBitSet。確かに、私はかなり多くの空白を使用したいと思います。

また、これは必要以上に長い配列になる可能性があります。配列作成式は次のようになります。

byte[] bytes = new byte[(bits.length() + 7) / 8];

これにより、必要なビット数だけのスペースが確保されますが、それ以上は必要ありません。基本的には「8で割るが、常に切り上げる」と同じです。

于 2011-06-01T07:02:40.870 に答える
10

エンディアンの問題のために BitSet を逆順にする必要がある場合は、次のように変更します。

バイト[bytes.length-i/8-1] |= 1<<(i%8);

に:

バイト[i/8] |= 1<<(7-i%8);

于 2012-12-14T11:24:40.773 に答える
3

これは私にとってはうまくいきます。Java 1.7 を使用している場合は、メソッドtoByteArray()があります。

于 2011-06-01T07:13:43.390 に答える