Come posso iterare i bit in un array di byte?Bit Iterate Java in matrice di byte
risposta
Dovresti scrivere una propria implementazione di Iterable<Boolean>
che ha avuto una serie di byte, e poi creato Iterator<Boolean>
valori che ricordavano l'indice corrente nell'array di byte e l'indice corrente all'interno del byte corrente. Poi un metodo di utilità come questo sarebbe tornare utile:
private static Boolean isBitSet(byte b, int bit)
{
return (b & (1 << bit)) != 0;
}
(dove bit
range da 0 a 7). Ogni volta che è stato chiamato next()
, dovresti incrementare il tuo indice di bit all'interno del byte corrente e incrementare l'indice di byte nell'array di byte se raggiungi "il 9 ° bit".
Non è davvero difficile - ma un po 'di dolore. Fammi sapere se desideri un'implementazione di esempio ...
È possibile scorrere l'array di byte e per ogni byte utilizzare gli operatori bit per bit per iterare i relativi bit.
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 utilizzando Java idiomi
for (byte b : byteArray) {
for (int mask = 0x01; mask != 0x100; mask <<= 1) {
boolean value = (b & mask) != 0;
}
}
avevo bisogno di un po 'po' di streaming nella mia applicazione. Here puoi trovare la mia implementazione BitArray. Non è un vero iteratore ma puoi chiedere 1-32 bit dall'array in modo streaming. C'è anche un'implementazione alternativa chiamata BitReader più avanti nel file.
Un'alternativa sarebbe quella di utilizzare un BitInputStream come quella che si può trovare here e scrivere codice come questo:
BitInputStream bin = new BitInputStream(new ByteArrayInputStream(bytes));
while(true){
int bit = bin.readBit();
// do something
}
bin.close();
(Nota:. Codice non contiene EOFException o IOException movimentazione per brevità)
Ma io andrei con la variante di Jon Skeets e lo farei per conto mio.
Lo so, probabilmente non è il modo "più bello" 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]);
}
numero Bit 1 = 1
numero Bit 2 = 0
numero Bit 3 = 0
numeroBit 4 = 1
numero di bit 5 = 1
numero Bit 6 = 1
numero Bit 7 = 0
numero Bit 8 = 0
È bello perché non fa uso di quelle operazioni "bituminose" spaventose. – Reginaldo
Non vedo alcuna necessità di utilizzare l'operatore bit a bit per qualcosa di semplice come richiesto dall'OP: iterate attraverso i bit. – amischiefr
Questo risponderebbe meglio alla domanda se mostrasse come estrarre i bit da un * byte array * (invece di String o 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);
}
}
- 1. Conversione matrice byte Java Edizione
- 2. Confronto bit a bit Java di un byte
- 3. Come convertire la matrice di byte in stringa in Java?
- 4. Quale struttura dati per una matrice di bit di bit?
- 5. Come convertire un byte in bit?
- 6. Char in byte? (Java)
- 7. Convertire ctype byte matrice di byte
- 8. Convertire la matrice di byte in decimale
- 9. Come inizializzare la matrice di byte di 100 byte in java con tutti gli 0
- 10. Swap ogni coppia di bit in byte
- 11. Scambio coppia di bit in un byte
- 12. Imposta bit specifico nel byte
- 13. Java: converte l'elenco di byte in serie di byte
- 14. Converti short to byte [] in Java
- 15. Come convertire una matrice di stringhe in una matrice di byte? (java)
- 16. algoritmo efficiente per la ricerca di un byte in una matrice di bit
- 17. Java: BufferedImage alla matrice di byte e ritorno
- 18. Converti byte in bit in python
- 19. Come convertire System.Drawing.Image in matrice di byte?
- 20. Operatore bit a bit per ottenere byte da 32 bit
- 21. Byte matrice serializzazione JSON.NET
- 22. Compatibilità Java 32-bit vs 64-bit
- 23. iterate valori int statici in java
- 24. Funzione restituisce matrice BYTE
- 25. Numero bit/dimensione byte dell'array
- 26. Esecuzione di bit per bit non su un byte
- 27. Informazioni sui byte Java
- 28. Come invertire i bit di un byte?
- 29. java tipo di dati byte
- 30. convertire 3 byte in int in java
Non è possibile.Almeno non direttamente. Cosa stai cercando di fare, forse c'è un modo migliore. Una matrice di byte contiene una raccolta di byte. – OscarRyz
E ancora una volta, vorrei che java.util.BitSet avesse un costruttore di byte []. –
Può essere fatto. Voterò che tu vada con il metodo di Jon Skeet. Tuttavia, nella maggior parte dei casi quando si lavora con bit, ci sono alcuni operatori bit a bit fantasia che possono rendere il compito andare molto più veloce. Se ci dici cosa stai cercando di fare, esattamente, potremmo aiutarti a trovare un modo migliore di iterare i bit. – StriplingWarrior