Frage

Wie kann ich iterieren Bits in einem Byte-Array?

War es hilfreich?

Lösung

Sie müßten Ihre eigene Implementierung von Iterable<Boolean> schreiben, die ein Array von Bytes haben, und dann Werte erstellt Iterator<Boolean>, die den aktuellen Index in den Byte-Array in Erinnerung und der aktuelle Index innerhalb des aktuellen Byte . Dann wird ein Dienstprogramm Methode, wie dies würde sich als nützlich erweisen:

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

(wobei bit im Bereich von 0 bis 7). Jedes Mal, next() hieß Sie Ihre Bit-Index innerhalb des aktuellen Byte erhöhen müsste, und erhöhe den Byte-Index innerhalb Byte-Array, wenn Sie „das 9. Bit“ erreicht.

Es ist nicht wirklich hart - aber ein bisschen Schmerz. Lassen Sie uns wissen, wenn Sie eine Beispielimplementierung mögen ...

Andere Tipps

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

oder mit Java Idiomen

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

Eine Alternative wäre eine BitInputStream wie das verwenden, die Sie finden können hier und schreiben Code wie folgt:

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

(Anmerkung:.-Code enthält keine EOFException oder IOException der Kürze der Handhabung)

Aber ich würde mit Jon Skeets Variante gehen und tun es auf eigene Faust.

Ich weiß, wahrscheinlich nicht die „coolste“ Art und Weise, es zu tun, aber Sie können jedes Bit mit dem folgenden Code extrahieren.

    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 Nummer 1 = 1

Bit Nummer 2 = 0

Bit Nummer 3 = 0

Bit Nummer 4 = 1

Bit Nummer 5 = 1

Bit Nummer 6 = 1

Bit Nummer 7 = 0

Bit Nummer 8 = 0

Sie können den Byte-Array durchlaufen und für jedes Byte die Bit-Operatoren verwenden obwohl seine Bits zu wiederholen.

brauchte ich einige Bit in meiner Anwendung Streaming. hier Sie können meine BitArray Implementierung finden. Es ist kein echtes Iterator Muster, aber Sie können in einem Streaming-Weg 1-32 Bits aus dem Array fragen. Es gibt auch eine alternative Implementierung BitReader später in der Datei mit dem Namen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top