Извлечение и объединение битов из разных байтов c Переполнение стека

Я объявил массив байтов:

uint8_t memory[123];

который я заполнил:

memory[0]=0xFF;
memory[1]=0x00;
memory[2]=0xFF;
memory[3]=0x00;
memory[4]=0xFF;

И теперь я получаю запросы от пользователя на конкретные биты. Например, я получаю запрос на отправку битов в позиции 10:35 и должен вернуть эти биты, объединенные в байтах. В этом случае мне нужно 4 байта, которые содержат.

response[0]=0b11000000;
responde[1]=0b00111111;
response[2]=0b11000000;
response[3]=0b00000011; //padded with zeros for excess bits

Это будет использоваться для Modbus, который является протоколом с прямым порядком байтов. Я придумал следующий код:

for(int j=findByteINIT;j<(findByteFINAL);j++){

aux[0]=(unsigned char) (memory[j]>>(startingbit-(8*findByteINIT)));
aux[1]=(unsigned char) (memory[j+1]<<(startingbit-(8*findByteINIT)));

response[h]=(unsigned char) (aux[0] | aux[1] );
h++;

aux[0]=0x00;//clean aux
aux[1]=0x00;

}

который не работает, но должен быть близок к идеальному решению. Какие-либо предложения?

1

Решение

Я думаю, что это должно сделать это.

int start_bit = 10, end_bit = 35; // input

int start_byte = start_bit / CHAR_BIT;
int shift = start_bit % CHAR_BIT;
int response_size = (end_bit - start_bit + (CHAR_BIT - 1)) / CHAR_BIT;
int zero_padding = response_size * CHAR_BIT - (end_bit - start_bit + 1);

for (int i = 0; i < response_size; ++i) {
response[i] =
static_cast<uint8_t>((memory[start_byte + i] >> shift) |
(memory[start_byte + i + 1] << (CHAR_BIT - shift)));
}
response[response_size - 1] &= static_cast<uint8_t>(~0) >> zero_padding;

Если входными данными являются начальный бит и число бит вместо начального бита и (включающего) конечного бита, то вы можете использовать точно такой же код, но вычислить вышеприведенный end_bit с помощью:

int start_bit = 10, count = 9;  // input
int end_bit = start_bit + count - 1;
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector