提取并合并不同字节中的位c 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;

        }

这不起作用,但应该接近理想的解决方案.有什么建议么?

解决方法:

我认为应该这样做.

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;
上一篇:1比特与2比特字符


下一篇:ThinkPHP 3 MVC模式和URL访问