2017-02-06 10 views
0

Я смотрю реализацию CoAP в ContikiOS, особенно при разборе заголовков, и у меня есть некоторые проблемы с пониманием двух операций. Код ниже.Анализ буфера в C

coap_pkt->version = (COAP_HEADER_VERSION_MASK & coap_pkt->buffer[0]) >> COAP_HEADER_VERSION_POSITION; 
coap_pkt->type = (COAP_HEADER_TYPE_MASK & coap_pkt->buffer[0]) >> COAP_HEADER_TYPE_POSITION; 

Coap_pkt структура, в которой хранится пакет и проанализированные значения.

  • версия представляет собой uint8_t (символ без знака) типа
  • Буфера дома пачки
  • Значения COAP_HEADER_VERSION_MASK является 0xC0
  • COAP_HEADER_VERSION_POSITION 6
  • значение типа представляет собой перечисление структуру с 4 значения
  • значение COAP_HEADER_TYPE_MASK является 0x30
  • значение COAP_HEADER_TYPE_POSITION составляет 4

Теперь, согласно CoAP RFC 7252, оба варианта и тип занимают два бита, и поэтому операции маски и используемые значения имеют смысл для меня.

Мой вопрос в том, почему переменные значения различаются в двух операциях?, Имеет ли он какое-то отношение к одному, используя unsigned char, а другую - структуру перечислений?

ответ

1

В основном это сдвигает оба значения до наименее значимых бит.

Биты версии имеют самые значащие биты, назовем их битами 7 и 6. Таким образом, четыре возможных значения с применяемой маской: 0xC0, 0x80, 0x40 и 0x00. Для последующего использования, например, для сравнения версий, изменение диапазона до 3, 2, 1 и 0 может быть более полезным, поэтому сдвиг на шесть бит перемещает значение в биты 1 и 0. (Фактически, в этом случае маска не нужна, поскольку сдвиг исключает все, кроме наиболее значимые два бита.)

Это та же история с битами типа, но это бит 5 и 4, что дает вам 0x30, 0x20, 0x10 и 0x00 после применения маски. Сдвиг на четыре бита перемещает эти биты в 1 и 0.

+0

ОК, я думаю, я понял, хотя первая операция состояла только из двух бит, а затем сдвиг помещал их в соответствующее положение, поэтому разница между 6 и 4 были запутанными. теперь я понимаю разницу. Спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^