Extract and combine bits from different bytes c c++

百般思念 提交于 2020-01-11 11:45:27

问题


I have declared an array of bytes:

uint8_t memory[123];

which i have filled with:

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

And now i get requests from the user for specific bits. For example, i receive a request to send the bits in position 10:35, and i must return those bits combined in bytes. In that case i would need 4 bytes which contain.

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

This will be used for Modbus which is a big-endian protocol. I have come up with the following code:

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;

        }

which does not work but should be close to the ideal solution. Any suggestions?


回答1:


I think this should do it.

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;

If the input is a starting bit and a number of bits instead of a starting bit and an (inclusive) end bit, then you can use exactly the same code, but compute the above end_bit using:

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


来源:https://stackoverflow.com/questions/22519184/extract-and-combine-bits-from-different-bytes-c-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!