Converting Between a BitSet and a Byte Array
// Returns a bitset containing the values in bytes.
// The byte-ordering of bytes must be big-endian which means the most significant bit is in element 0.
public static BitSet fromByteArray(byte[] bytes) {
BitSet bits = new BitSet();
for (int i=0; i<bytes.length*8; i++) {
if ((bytes[bytes.length-i/8-1]&(1<<(i%8))) > 0) {
bits.set(i);
}
}
return bits;
}
// Returns a byte array of at least length 1.
// The most significant bit in the result is guaranteed not to be a 1
// (since BitSet does not support sign extension).
// The byte-ordering of the result is big-endian which means the most significant bit is in element 0.
// The bit at index 0 of the bit set is assumed to be the least significant bit.
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;
}
//Comments
1389



被折叠的 条评论
为什么被折叠?




Please be aware the above example will lose 1 bit for every byte read if the highest order bit is set. (byte)(1<<7) = -128 in Java and therefore will never be >0. To fix this example change >0 to !=0.
Also, it would be easy and preferable to serialize to longs as the Java implementation does.
Note that the Java 7 specification provides methods for converting between BitSets and bytes/longs.