C 中的缓冲区解析

Buffer Parsing in C

我正在查看 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 包含数据包和解析值的结构。

现在根据 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。