Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的缓冲区解析_C_Enums_Coap - Fatal编程技术网

C语言中的缓冲区解析

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]) >

我正在研究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\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值之间的差异令人困惑。现在我明白了区别。谢谢