質問
バイト配列のビットを反復するにはどうすればよいですか?
解決
バイトの配列を取得したIterable<Boolean>
の独自の実装を作成し、次にバイト配列への現在のインデックスを記憶するIterator<Boolean>
値を作成し、 現在のインデックスを作成する必要があります現在のバイト内。次に、このようなユーティリティメソッドが役立ちます。
private static Boolean isBitSet(byte b, int bit)
{
return (b & (1 << bit)) != 0;
}
(bit
の範囲は0〜7)。 next()
が呼び出されるたびに、現在のバイト内のビットインデックスをインクリメントし、<!> quot; 9番目のビット<!> quot;に達した場合、バイト配列内のバイトインデックスをインクリメントする必要があります。
それは本当に難しいではありませんが、少し苦痛です。サンプル実装が必要かどうか教えてください...
他のヒント
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);
}
}
オリジナル:
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;
}
}
またはJavaイディオムを使用
for (byte b : byteArray ) {
for ( int mask = 0x01; mask != 0x100; mask <<= 1 ) {
boolean value = ( b & mask ) != 0;
}
}
別の方法は、こちらにあるようなBitInputStreamを使用することです。 そして次のようなコードを書きます:
BitInputStream bin = new BitInputStream(new ByteArrayInputStream(bytes));
while(true){
int bit = bin.readBit();
// do something
}
bin.close();
(注:簡潔にするために、コードにはEOFExceptionまたはIOException処理は含まれていません。)
しかし、私はJon Skeetsのバリアントを使用して、自分でそれを実行します。
知っている、おそらく<!> quot; coolest <!> quot;方法ですが、次のコードで各ビットを抽出できます。
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
ビット番号1 = 1
ビット番号2 = 0
ビット番号3 = 0
ビット番号4 = 1
ビット番号5 = 1
ビット番号6 = 1
ビット番号7 = 0
ビット番号8 = 0
バイト配列を反復処理でき、各バイトごとにビット演算子を使用してビットを反復処理できます。
アプリケーションでビットストリーミングが必要でした。 ここに私のBitArrayの実装があります。これは実際のイテレータパターンではありませんが、ストリーミング方式で配列から1〜32ビットを要求できます。ファイルの後半には、BitReaderという別の実装もあります。