Java ITERATE Bits na matriz de bytes
Pergunta
Como posso iterar bits em um array de bytes?
Solução
Você teria que escrever sua própria implementação de Iterable<Boolean>
que teve um array de bytes, e depois criou valores Iterator<Boolean>
que lembrava o índice atual na matriz de bytes e o índice atual dentro do byte atual . Em seguida, um método utilitário como este viria a calhar:
private static Boolean isBitSet(byte b, int bit)
{
return (b & (1 << bit)) != 0;
}
(em que gamas de bit
de 0 a 7). Cada next()
tempo foi chamado você teria que aumentar o seu índice de bit dentro do byte atual e incrementar o índice de byte dentro de matriz de bytes se você chegou a "9ª pouco".
Não é realmente duro - mas um pouco de dor. Deixe-me saber se você gostaria de uma implementação de exemplo ...
Outras dicas
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 usando expressões idiomáticas Java
for (byte b : byteArray ) {
for ( int mask = 0x01; mask != 0x100; mask <<= 1 ) {
boolean value = ( b & mask ) != 0;
}
}
Uma alternativa seria usar um BitInputStream como o que você pode encontrar aqui e escrever código como este:
BitInputStream bin = new BitInputStream(new ByteArrayInputStream(bytes));
while(true){
int bit = bin.readBit();
// do something
}
bin.close();
. (Nota: Código não contêm EOFException ou IOException manipulação por brevidade)
Mas eu iria com variante Jon Skeets e fazê-lo em meu próprio.
Eu sei, provavelmente não é o "mais legal" maneira de fazer isso, mas você pode extrair cada bit com o seguinte 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 Bit 1 = 1
Número Bit 2 = 0
Número Bit 3 = 0
número de bit 4 = 1
número de bit 5 = 1
número de bits 6 = 1
Número Bit 7 = 0
Número Bit 8 = 0
Você pode percorrer a matriz de bytes, e para cada uso byte os operadores bit a bit para iterar embora seus bits.
Eu precisava de algum pouco de streaming no meu aplicativo. aqui pode encontrar minha implementação BitArray. Não é um padrão iterator real, mas você pode pedir 1-32 bits da matriz em uma maneira de streaming. Há também uma implementação alternativa chamada BitReader no final do arquivo.