Получение диапазона битов из байтового массива

Обратите внимание на пакет python-daemon , который решает множество проблем, стоящих за демонами.

Среди других функций он позволяет (из описания пакета Debian):

  • Отключите процесс в своей группе процессов.
  • Установите среду процесса, подходящую для работы внутри chroot.
  • Отказаться от прав suid и sgid.
  • Закройте все дескрипторы открытых файлов.
  • Измените рабочий каталог, uid, gid и umask.
  • Установите соответствующие обработчики сигналов.
  • Откройте новые файловые дескрипторы для stdin, stdout и stderr.
  • Управление указанным файлом блокировки PID.
  • Зарегистрировать функции очистки для обработки на выходе.

1
задан jondal88 1 March 2019 в 23:40
поделиться

2 ответа

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

Ниже приведен основной пример. Я использую индексы, начинающиеся с 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;
    }
0
ответ дан Dean 1 March 2019 в 23:40
поделиться

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

байт [] s = {(байт) 0b01000000, (байт) 0b00000000, (байт) 0b00010011, (байт) 0b00010000, (байт) 0b11101100, (байт) 0b00010001, (байт) 0b11101100 (байт) 0b0001 byte) 0b11101100, (byte) 0b00010001}

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

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

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

0
ответ дан jondal88 1 March 2019 в 23:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: