0

我正在查看 ContikiOS 中的 CoAP 实现,特别是在标头解析方面,我在理解两个操作时遇到了一些麻烦。代码如下。

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 和另一个使用 enum 结构有关?

4

1 回答 1

1

基本上,这会将两个值都向下移动到最低有效位。

版本位是最高有效位,我们称它们为位 7 和 6。因此,应用掩码的四个可能值是 0xC0、0x80、0x40 和 0x00。对于以后的使用,例如版本比较,将范围更改为 3、2、1 和 0 可能更有用,因此移动 6 位会将值移动到位 1 和 0。(实际上,在这种情况下不需要掩码,因为移位消除了除最重要的两位之外的所有位。)

类型位也是如此,但它们是位 5 和 4,在应用掩码后为您提供 0x30、0x20、0x10 和 0x00。移位四位会将这些位移动到 1 和 0。

于 2017-02-06T12:09:29.620 回答