我正在研究 ContikiOS 中的 CoAP 实现,特别是在 header 解析方面,我在理解两个操作时遇到了一些困难。代码如下。
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 和另一个使用枚举结构有关吗?
最佳答案
基本上,这会将两个值下移到最低有效位。
版本位位于最高有效位,我们将其称为位 7 和位 6。因此,应用掩码后的四个可能值是 0xC0、0x80、0x40 和 0x00。供以后使用,例如对于版本比较,将范围更改为 3、2、1 和 0 可能更有用,因此移位六位会将值移动到位 1 和 0。(事实上,在这种情况下,掩码是不必要的,因为移位消除了除最高有效两位。)
类型位也是同样的情况,但它们是位 5 和 4,在应用掩码后为您提供 0x30、0x20、0x10 和 0x00。移位四位会将这些位移至 1 和 0。
关于c - C 中的缓冲区解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42067328/