Question

Comment puis-je itérer des bits dans un tableau d'octets?

Était-ce utile?

La solution

Vous devez écrire votre propre implémentation de Iterable<Boolean> qui prend un tableau d'octets, puis crée Iterator<Boolean> des valeurs qui mémorisent l'index actuel dans le tableau d'octets et l'index actuel. dans l'octet en cours. Ensuite, une méthode d’utilité comme celle-ci serait utile:

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

(où bit est compris entre 0 et 7). Chaque fois que next() a été appelé, vous devez incrémenter votre index de bits dans l'octet actuel et l'incrémenter dans un tableau d'octets si vous avez atteint & "; Le 9ème bit &";.

Ce n'est pas vraiment difficile - mais un peu pénible. Faites-moi savoir si vous souhaitez un exemple d'implémentation ...

Autres conseils

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

Ou en utilisant les idiomes Java

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

Une alternative serait d'utiliser un BitInputStream comme celui que vous pouvez trouver ici et écrivez un code comme celui-ci:

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

(Remarque: le code ne contient pas de gestion EOFException ou IOException pour des raisons de concision.)

Mais j'irais avec la variante de Jon Skeets et le ferais tout seul.

Je sais, probablement pas le & "Coolest &"; façon de le faire, mais vous pouvez extraire chaque bit avec le code suivant.

    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

Numéro de bit 1 = 1

Numéro de bit 2 = 0

Bit numéro 3 = 0

Nombre de bits 4 = 1

Bit numéro 5 = 1

Bit numéro 6 = 1

Numéro de bit 7 = 0

Numéro de bit 8 = 0

Vous pouvez parcourir le tableau d'octets. Pour chaque octet, utilisez les opérateurs au niveau du bit pour parcourir ses bits.

J'avais besoin d'un peu de streaming dans mon application. Ici , vous pouvez trouver mon implémentation BitArray. Ce n'est pas un véritable modèle d'itérateur, mais vous pouvez demander de 1 à 32 bits à partir de la matrice de manière continue. Il existe également une autre implémentation appelée BitReader plus tard dans le fichier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top