Pregunta

¿Cómo puedo iterar bits en una matriz de bytes?

¿Fue útil?

Solución

Tendría que escribir su propia implementación de Iterable<Boolean> que tomó una matriz de bytes, y luego creó Iterator<Boolean> valores que recordaban el índice actual en la matriz de bytes y el índice actual dentro del byte actual. Entonces, un método de utilidad como este sería útil:

private static Boolean isBitSet(byte b, int bit)
{
    return (b & (1 << bit)) != 0;
}

(donde bit varía de 0 a 7). Cada vez que se llamaba a next(), tendría que incrementar su índice de bits dentro del byte actual e incrementar el índice de bytes dentro de la matriz de bytes si alcanzaba & Quot; el noveno bit & Quot ;.

No es realmente difícil , sino un poco molesto. Avíseme si desea una implementación de muestra ...

Otros consejos

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);
    }
}

Original:

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 expresiones idiomáticas de Java

for (byte b : byteArray ) {
  for ( int mask = 0x01; mask != 0x100; mask <<= 1 ) {
      boolean value = ( b & mask ) != 0;
  }
}

Una alternativa sería utilizar un BitInputStream como el que puede encontrar aquí y escriba código como este:

BitInputStream bin = new BitInputStream(new ByteArrayInputStream(bytes));
    while(true){
        int bit = bin.readBit();
        // do something
    }
bin.close();

(Nota: el código no contiene EOFException o IOException para abreviar).

Pero iría con la variante Jon Skeets y lo haría por mi cuenta.

Lo sé, probablemente no sea el " cool " manera de hacerlo, pero puede extraer cada bit con el siguiente código.

    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

Número de bit 1 = 1

Número de bit 2 = 0

Número de bit 3 = 0

Número de bit 4 = 1

Número de bit 5 = 1

Número de bit 6 = 1

Número de bit 7 = 0

Número de bit 8 = 0

Puede iterar a través de la matriz de bytes, y para cada byte use los operadores bit a bit para iterar a través de sus bits.

Necesitaba un poco de transmisión en mi aplicación. Aquí puede encontrar mi implementación de BitArray. No es un patrón iterador real, pero puede solicitar 1-32 bits de la matriz de forma continua. También hay una implementación alternativa llamada BitReader más adelante en el archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top