Запись битов через два байта - PullRequest
2 голосов
/ 19 сентября 2019

У меня есть требование, когда я должен записать HEX-значение в 11-битный «контейнер» через два байта.Раскладка выглядит следующим образом: Байт 5 (бит 3) - это младший бит, а данные идут в байт 4 (бит 5), который является msb.Каков наилучший метод записи данных в рассматриваемые битовые местоположения?

Например, если мне нужно записать значение 0x1DA в эти места, что было бы наилучшим способом сделать это, сохраняя правильный порядок следования битов.

К вашему сведению, для связи по CAN длябайтовое сообщение CAN.

Я думал о том, чтобы сделать это:

_templsb = DatatoWrite & 0x1F;
_templsb <<= 3;
Byte5 &= ~0xF8;
Byte5 = Byte5 | _templsb;

_tempmsb = DatatoWrite & 0x7E0;
_tempmsb >>= 5;
Byte4 &= ~0x3F;
Byte4 =  Byte4 | _tempmsb;

Что-то вроде этого - лучший способ сделать это?

1 Ответ

1 голос
/ 21 сентября 2019

Чтобы было ясно, похоже, что вы хотите достичь следующего расположения:

enter image description here

Так что для вашего примера 0x01DA преобразованиебудет:

  • Byte4 = 0x0E
  • Byte5 = 0xD0

Это существов этом случае:

uint16_t Word = 0x1DA ;
uint8_t Byte4 = (Word & 0x07E0) >> 5 ;
uint8_t Byte5 = (Word & 0x001F) << 3 ;

Если неиспользуемые биты в Byte4 и Byte5 уже содержат данные, которые должны остаться неизменными, то:

Byte4 = (Byte4 & 0xC0) | (Word & 0x07E0) >> 5 ;
Byte5 = (Byte5 & 0x07) | (Word & 0x001F) << 3 ;
...