سؤال

وكيف يمكنني تكرار البتات في مجموعة بايت؟

هل كانت مفيدة؟

المحلول

وأنت تريد أن تكتب تنفيذ الخاص بك من Iterable<Boolean> الذي عقد مجموعة من وحدات البايت، والقيم Iterator<Boolean> ثم خلق التي تذكر المؤشر الحالي إلى صفيف بايت <م> و المؤشر الحالي ضمن بايت الحالي . ثم طريقة فائدة مثل هذا من شأنه أن تأتي في متناول اليدين:

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

و(حيث يتراوح bit 0-7). كان كل next() وقت دعا عليك أن زيادة مؤشر قليلا الخاص بك في غضون البايت الحالي، وزيادة مؤشر بايت ضمن مجموعة بايت إذا وصلت إلى "بت 9TH".

وانها ليست حقا <م> من الصعب - ولكن قليلا من الألم. اسمحوا لي أن أعرف إذا كنت ترغب في تطبيق نموذج ...

نصائح أخرى

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;
   }
}

وأو باستخدام التعابير جافا

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 التعامل مع الايجاز)

ولكن كنت اذهب مع جون Skeets البديل وتفعل ذلك من تلقاء نفسي.

وأنا أعلم، وربما ليست الطريقة "أروع" للقيام بذلك، ولكن يمكنك استخراج كل بت مع التعليمات البرمجية التالية.

    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