c - C 中的缓冲区解析

标签 c enums coap

我正在研究 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/

相关文章:

c - typedef struct 声明错误?

计算CUDA中两个三角形之间的角度

c++ - 在 C++ 中向枚举添加 "all"选项的好的设计是什么?

C 包含文件行为

c - 米转英尺英寸的C语言程序?

Swift 4.2 & 观察枚举值

c# - 使用基于枚举值的函数?

java - 接收乐山服务器上观察到的对象变化

node.js - node.js 中的 OneM2M coap 客户端

javascript - Nodejs + 发送后无法设置 header