The simplest way to encode bits into byte array is via BitSet
:
private static byte[] bitsToBytes(byte[] bits) {
BitSet bitSet = new BitSet();
for (int i = 0; i < bits.length; i++) {
bitSet.set(i, bits[i] == 1);
}
return bitSet.toByteArray();
}
Note bits[i] == 1
instead of just bits[i]
, because it would be a different method that accepts two indices, not an index and a value.
Here's how you can check it:
public static void main(String[] args) {
System.out.println(Arrays.toString(bitsToBytes(new byte[]{0})));
System.out.println(Arrays.toString(bitsToBytes(new byte[]{1})));
System.out.println(Arrays.toString(bitsToBytes(new byte[]{1, 1})));
System.out.println(Arrays.toString(bitsToBytes(new byte[]{1, 0, 1})));
System.out.println(Arrays.toString(bitsToBytes(new byte[]{1, 1, 1, 1, 1, 1, 1})));
System.out.println(Arrays.toString(bitsToBytes(new byte[]{1, 1, 1, 1, 1, 1, 1, 0})));
System.out.println(Arrays.toString(bitsToBytes(new byte[]{1, 1, 1, 1, 1, 1, 1, 1})));
System.out.println(Arrays.toString(bitsToBytes(new byte[]{0, 0, 1, 1, 0, 0, 0, 0})));
System.out.println(Arrays.toString(bitsToBytes(new byte[]{1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 1, 1, 0, 0, 0, 0})));
}
The reverse conversion (as requested in the comments) in general needs the number of bits, to ignore the trailing zero bits. Here's the code:
private static byte[] bytesToBits(int nbits, byte[] bits) {
BitSet bitSet = BitSet.valueOf(bits);
byte[] result = new byte[nbits];
for (int i = 0; i < result.length; i++) {
result[i] = (byte) (bitSet.get(i) ? 1 : 0);
}
return result;
}