문제

바이트 어레이에서 비트를 반복하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

자신의 구현을 작성해야합니다 Iterable<Boolean> 바이트 배열을 가져간 다음 생성했습니다. Iterator<Boolean> 바이트 배열로의 현재 색인을 기억 한 값 그리고 현재 바이트 내의 현재 색인. 그러면 이와 같은 유틸리티 방법이 편리합니다.

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

(어디 bit 0에서 7 사이의 범위). 매번 next() 현재 바이트 내에서 비트 인덱스를 증가시켜야하고 "9 번째 비트"에 도달하면 바이트 배열 내에서 바이트 색인을 증가시켜야합니다.

실제로는 아닙니다 딱딱한 - 그러나 약간의 고통. 샘플 구현을 원하시면 알려주세요 ...

다른 팁

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 Variant와 함께 가서 스스로 할 것입니다.

아마도 "가장 멋진"방법은 아니지만 다음 코드로 각 비트를 추출 할 수 있습니다.

    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라는 대체 구현도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top