C 指针引用混合'*';和'-&燃气轮机';语法混乱
我不是一个专业的C开发人员。。。老实说,我不是一个专业的开发人员,所以我使用的术语可能不正确 我花了大约一个小时阅读了C 指针引用混合'*';和'-&燃气轮机';语法混乱,c,pointers,syntax,C,Pointers,Syntax,我不是一个专业的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 retur
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\u int16\t(packet->payload,0)
将packet->payload
指针引用的数据拆分为8位部分,并返回前8位(由于+0
)
这是我试图保留的nDPI库的单个部分中的一个示例
[注]
是一个函数,它以主机字节顺序(大多数机器上为小端,大端机器上为大端)获取字(16位),并将其转换为网络字节顺序的字(始终为大端)。在这种情况下,数据包->有效载荷
(感谢AndreyT!)的偏移量0处的字
将返回一个大端的字
,因此ntop开发人员决定使用htons()
转换给定值(在这种情况下,是一个字节模式,用于确定流是否符合Apple归档协议)这是网络堆栈的小端到大端
[更多]
我提出的建议可能对将来处理类似情况的人有用。你是对的,但不是完全正确
u\u int8\t
类型用作寻址单元。它基本上是一个“字节”。那么
part只选择从X
指向的内存块开始的字节偏移量O
处的位置。这就是u\u int8\t
type的角色结束的地方
然后*(u\u int16\u t*)
部分将该内存位置解释为无符号16位字
所以,除了宏“返回”一个存储在地址X+O
的16位值(不是8位值)之外,一切都正常。在您的特定示例中,宏用于读取存储在内存块数据包->有效负载最开始(偏移量0
)处存储的无符号16位值
请注意,以这种方式写入的宏计算为左值,这意味着它也可以用于在给定内存块中以特定字节偏移量写入16位数据,例如
get_u_int16_t(packet->payload, 0) = 42;
将42
写入内存块最开始处的16位字数据包->有效载荷
非常好的、容易理解的答案!非常感谢!
get_u_int16_t(packet->payload, 0) = 42;