Обратите внимание на пакет python-daemon , который решает множество проблем, стоящих за демонами.
Среди других функций он позволяет (из описания пакета Debian):
Вы можете сделать это, используя операции сдвига влево и вправо. Они преобразуют байты в целые числа, поэтому их необходимо преобразовать обратно в байт.
Ниже приведен основной пример. Я использую индексы, начинающиеся с 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;
}
К сожалению, ваш метод может решить только каждый второй байт правильно, не знаю почему: 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, до тех пор, пока эти биты не окажутся в правильном положении, чтобы прочитать его непосредственно из байтового массива. Спасибо за вашу помощь!