Получение диапазона битов из байтового массива - PullRequest
0 голосов
/ 02 марта 2019

Я хочу получить определенный диапазон битов из байтового массива {0b00000001, 0b00100011, 0b00010001} и преобразовать его в другой байтовый массив.Например, с 5-го по 12-й слева направо.Результат будет выглядеть как этот байтовый массив {0b00010010}.К сожалению, я не смог найти более быстрый вариант, чем читать биты один за другим и добавлять их к строителю строк до 8, а затем помещать их в массив.Надеюсь, кто-нибудь может решить эту проблему, спасибо.

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

К сожалению, ваш метод может решить только каждый второй байт правильно, не знаю почему: DI проверил это с этим байтовым массивом с начала = 12 и конца = 48.

byte [] s = {(byte) 0b01000000, (байт) 0b00000000, (байт) 0b00010011, (байт) 0b00010000, (байт) 0b11101100, (байт) 0b00010001, (байт) 0b11101100, (байт) 0b00010001, (байт) 0b111010000 (байт) 000111010000 (байт) 00011010000 (байт) 00011010000 (байт) 00011010000 (байт)*

Результат был таким:

00000001 00110001 11111110 <- это не работает 11000001 00001110 </p>

Я нашел другое решение с BigInteger, используя rightShift и leftShift, пока эти биты не окажутся в правильномпозиция, чтобы прочитать это непосредственно от байтового массива.Спасибо за вашу помощь!

0 голосов
/ 02 марта 2019

Вы можете сделать это, используя операции сдвига влево и вправо.Они преобразуют байты в целые числа, поэтому их необходимо преобразовать обратно в байт.

Ниже приведен базовый пример.Я использую индексы, начинающиеся с 0, поэтому для проверки вашего примера вы должны вызвать rangeOf (sourceByteArray, 4, 11).Эта функция только демонстрирует метод;проверка должна быть сделана на диапазонах, и это может быть сделано быстрее.

public byte[] rangeOf(byte[] source, int start, int end){
        int firstSourceByte = start/8;
        int shift = start%8;
        int size = (end - start)/8;
        if ((end - start)%8>0) size++;
        byte[] returnArray = new byte[size];

        for(int i = 0; i < size; i++) {
            returnArray[i] = (byte) (source[firstSourceByte + i] << shift);
            returnArray[i] += (byte) (source[firstSourceByte + i +1] >> (8 - shift));
        }

        return returnArray;
    }
...