Bit di iterazione Java in array di byte
Domanda
Come posso iterare i bit in un array di byte?
Soluzione
Dovresti scrivere la tua implementazione di Iterable<Boolean>
che ha preso una matrice di byte e quindi ha creato Iterator<Boolean>
valori che hanno ricordato l'indice corrente nella matrice di byte e l'indice corrente all'interno del byte corrente. Quindi un metodo di utilità come questo sarebbe utile:
private static Boolean isBitSet(byte b, int bit)
{
return (b & (1 << bit)) != 0;
}
(dove bit
varia da 0 a 7). Ogni volta che viene chiamato next()
dovresti incrementare il tuo indice di bit all'interno del byte corrente e incrementare l'indice di byte all'interno della matrice di byte se raggiungi & Quot; il nono bit & Quot ;.
Non è davvero difficile , ma un po 'doloroso. Fammi sapere se desideri un'implementazione di esempio ...
Altri suggerimenti
public class ByteArrayBitIterable implements Iterable<Boolean> {
private final byte[] array;
public ByteArrayBitIterable(byte[] array) {
this.array = array;
}
public Iterator<Boolean> iterator() {
return new Iterator<Boolean>() {
private int bitIndex = 0;
private int arrayIndex = 0;
public boolean hasNext() {
return (arrayIndex < array.length) && (bitIndex < 8);
}
public Boolean next() {
Boolean val = (array[arrayIndex] >> (7 - bitIndex) & 1) == 1;
bitIndex++;
if (bitIndex == 8) {
bitIndex = 0;
arrayIndex++;
}
return val;
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
public static void main(String[] a) {
ByteArrayBitIterable test = new ByteArrayBitIterable(
new byte[]{(byte)0xAA, (byte)0xAA});
for (boolean b : test)
System.out.println(b);
}
}
originale:
for (int i = 0; i < byteArray.Length; i++)
{
byte b = byteArray[i];
byte mask = 0x01;
for (int j = 0; j < 8; j++)
{
bool value = b & mask;
mask << 1;
}
}
O usando idiomi Java
for (byte b : byteArray ) {
for ( int mask = 0x01; mask != 0x100; mask <<= 1 ) {
boolean value = ( b & mask ) != 0;
}
}
Un'alternativa sarebbe usare un BitInputStream come quello che puoi trovare qui e scrivi codice in questo modo:
BitInputStream bin = new BitInputStream(new ByteArrayInputStream(bytes));
while(true){
int bit = bin.readBit();
// do something
}
bin.close();
(Nota: il codice non contiene EOFException o IOException per brevità).
Ma andrei con la variante di Jon Skeets e lo farei da solo.
Lo so, probabilmente non il " il più cool " modo per farlo, ma è possibile estrarre ogni bit con il seguente codice.
int n = 156;
String bin = Integer.toBinaryString(n);
System.out.println(bin);
char arr[] = bin.toCharArray();
for(int i = 0; i < arr.length; ++i) {
System.out.println("Bit number " + (i + 1) + " = " + arr[i]);
}
10011100
Bit numero 1 = 1
Bit numero 2 = 0
Bit numero 3 = 0
Bit numero 4 = 1
Bit numero 5 = 1
Bit numero 6 = 1
Bit numero 7 = 0
Bit numero 8 = 0
Puoi iterare attraverso l'array di byte e per ogni byte usare gli operatori bit a bit per iterare attraverso i suoi bit.
Avevo bisogno di un po 'di streaming nella mia applicazione. Qui puoi trovare la mia implementazione di BitArray. Non è un vero modello iteratore ma è possibile richiedere 1-32 bit dall'array in modo streaming. C'è anche un'implementazione alternativa chiamata BitReader più avanti nel file.