C语言中的缓冲区解析
我正在研究ContikiOS中的CoAP实现,特别是在头解析方面,我在理解两个操作时遇到了一些困难。代码如下C语言中的缓冲区解析,c,enums,coap,C,Enums,Coap,我正在研究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_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\u t无符号字符类型
缓冲区存放着包裹
COAP_头版本掩码值为0xC0
COAP_收割台版本位置为6
类型值是具有4个值的枚举结构
COAP_标头_类型_掩码值为0x30
COAP_收割台类型位置值为4
现在根据CoAP RFC 7252,版本和类型都占用两位,因此掩码操作和使用的值对我来说是有意义的
我的问题是,为什么这两个操作中的移位值不同?这与一个使用无符号字符,另一个使用枚举结构有关吗 基本上,这会将两个值下移到最低有效位 版本位是最高有效位,我们称之为第7位和第6位。因此,应用掩码的四个可能值是0xC0、0x80、0x40和0x00。对于以后的使用,例如版本比较,将范围更改为3、2、1和0可能更有用,因此移位6位会将值移动到位1和0。实际上,在这种情况下,掩码是不必要的,因为移位消除了除最重要的两位之外的所有位
类型位的情况相同,但它们是位5和位4,在应用掩码后给出0x30、0x20、0x10和0x00。四位移位会将这些位移到1和0。好的,我想我明白了,我认为第一个操作只保留两位,然后移位会将它们放在适当的位置,所以6值和4值之间的差异令人困惑。现在我明白了区别。谢谢