Comment puis-je itérer des bits dans un tableau d'octets?Bits d'itération Java dans la matrice d'octets
Répondre
Vous devriez écrire votre propre implémentation de Iterable<Boolean>
qui a un tableau d'octets, puis créé Iterator<Boolean>
valeurs qui se souvenaient de l'indice courant dans le tableau d'octets et l'indice de courant dans l'octet courant. Ensuite, une méthode utilitaire comme celui-ci serait utile:
private static Boolean isBitSet(byte b, int bit)
{
return (b & (1 << bit)) != 0;
}
(où bit
varie de 0 à 7). Chaque fois que next()
était appelé, vous deviez incrémenter votre index binaire dans l'octet courant, et incrémenter l'index d'octets dans le tableau d'octets si vous atteigniez "le neuvième bit".
Ce n'est pas vraiment dur - mais un peu d'une douleur. Faites-moi savoir si vous souhaitez un exemple d'implémentation ...
Vous pouvez parcourir le tableau d'octets et, pour chaque octet, utiliser les opérateurs au niveau du bit pour parcourir ses bits.
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 idiomes Java
for (byte b : byteArray) {
for (int mask = 0x01; mask != 0x100; mask <<= 1) {
boolean value = (b & mask) != 0;
}
}
je avais besoin de peu de streaming dans mon application. Here vous pouvez trouver mon implémentation BitArray. Ce n'est pas un vrai modèle d'itérateur, mais vous pouvez demander de 1 à 32 bits à partir du tableau de façon continue. Il existe également une autre implémentation appelée BitReader plus tard dans le fichier.
Une alternative serait d'utiliser un BitInputStream comme celui que vous pouvez trouver here et écrire du code comme ceci:
BitInputStream bin = new BitInputStream(new ByteArrayInputStream(bytes));
while(true){
int bit = bin.readBit();
// do something
}
bin.close();
(Note:. Code ne contient pas EOFException ou manipulation IOException par souci de concision)
Mais j'irais avec Jon Skeets variante et le faire moi-même.
Je sais, probablement pas la façon la plus «cool» 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]);
}
Numéro de bit 1 = 1
Numéro de bit 2 = 0
Numéro de bit 3 = 0
Numéro de bit 4 = 1
Numéro de bit 5 = 1
Bit numéro 6 = 1
numéro de bit 7 = 0
Numéro de Bit 8 = 0
C'est cool parce qu'il ne fait aucun usage de ces opérations «effrayantes» de bit. – Reginaldo
Je ne vois aucun besoin d'utiliser l'opérateur au niveau du bit pour quelque chose d'aussi simple que l'OP l'a demandé: parcourir les bits. – amischiefr
Cela permettrait de mieux répondre à la question si elle montrait comment extraire des bits d'un tableau * byte * (au lieu de String ou char array) – Jonik
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);
}
}
Vous ne peut pas.Au moins pas directement. Qu'est-ce que vous essayez de faire, peut-être qu'il y a un meilleur moyen. Un tableau d'octets contient une collection d'octets. – OscarRyz
Et encore une fois, je souhaite que java.util.BitSet ait un constructeur byte []. –
Cela peut être fait. Je voterais avec la méthode de Jon Skeet. Cependant, dans la plupart des cas, lorsque vous travaillez avec des bits, il y a quelques opérateurs de bits sophistiqués qui peuvent rendre votre tâche beaucoup plus rapide. Si vous nous dites exactement ce que vous essayez de faire, nous pourrions vous aider à trouver une meilleure solution que d'itérer les bits. – StriplingWarrior