我不是通过交易的C开发人员...说实话,我不是交易开发者,所以我使用的术语可能不正确。
我花了大约一小时左右阅读define
语句,然后阅读pointer
个引用,并对以下实例感到困惑。
假设:
#define get_u_int16_t (X,O) (*(u_int16_t *)(((u_int8_t *)X) + O))
if (get_u_int16_t(packet->payload, 0) == htons(0x0004)) {
//do something
return;
}
这是否意味着get_u_int16_t(packet->payload, 0)
将packet->payload
指针引用的数据拆分为8位部分,并返回前8位(由于+ 0
)?
这是我尝试保留的{nQI库的一部分afp.c中的一个示例。
[注]
htons()是一个以主机字节顺序为word
(16位)的函数(大多数机器上的小端,或大端机器上的大端)并将其转换为{{1网络字节顺序(总是大端)。在这种情况下,word
偏移0 word
(感谢AndreyT!)将返回大端的packet->payload
,因此ntop开发人员决定使用word
进行转换一个给定的值(在这种情况下是一个字节模式,确定一个流是Apple文件协议),它是网络堆栈大端的小端。
[详细]
我已经移动了some questions to a forum that is more conducive to fuzzy questions to have some technicalities understood,这可能对将来处理类似情况的人有用。
答案 0 :(得分:2)
你是对的,但不是完全的。
u_int8_t
类型用作寻址单元。它基本上是一个“字节”。所以
((u_int8_t *)X) + O)
部分只是从O
指向的内存块的开头选择字节偏移量X
处的位置。这就是u_int8_t
类型的角色结束的地方。
然后*(u_int16_t *)
部分将该存储器位置解释为无符号的16位字。
所以,除了宏“返回”存储在地址X + O
的16位值(不是8位值)之外,你得到了一切。在您的具体示例中,宏用于读取存储块0
的最开始(偏移packet->payload
)存储的无符号16位值。
请注意,以这种方式编写的宏的计算结果为 lvalue ,这意味着它也可用于在给定的特定字节偏移量中写入 16位数据内存块,例如
get_u_int16_t(packet->payload, 0) = 42;
会将42
写入驻留在内存块packet->payload
最开头的16位字中。