0

我不是专业的 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)?

这是我尝试保留的 nDPI 库的单个部分 afp.c 的示例

[笔记]

htons()是一个函数,它采用word主机字节顺序(大多数机器上的小端,或大端机器上的大端)的(16 位)并将其转换为word网络字节顺序(总是大端)。在这种情况下,(感谢 AndreyT!)word的偏移量 0将返回大端序,因此 ntop 开发人员决定使用来转换给定值(在这种情况下,确定流是否为的字节模式之一Apple 归档协议),它是网络堆栈的小端到大端。packet->payloadwordhtons()

[更多的]

我已经将一些问题移到了一个更有利于模糊问题的论坛,以了解一些技术细节,这些技术细节可能对未来处理类似情况的人有用。

4

1 回答 1

2

你是对的,但不完全正确。

u_int8_t类型用作寻址单元。它基本上是一个“字节”。所以

((u_int8_t *)X) + O)

O部分只是从 .指向的内存块的开头选择字节偏移的位置X。这就是u_int8_t类型的作用结束的地方。

然后该*(u_int16_t *)部分将该内存位置解释为无符号 16 位字。

所以,除了宏“返回”一个存储在 address 的 16 位值(不是 8 位值)之外,你做对了一切X + O0在您的具体示例中,宏用于读取存储在memory block最开始(偏移量)的无符号 16 位值packet->payload

请注意,以这种方式编写的宏的计算结果为左值,这意味着它也可以用于在给定内存块中的特定字节偏移处写入16 位数据,例如

get_u_int16_t(packet->payload, 0) = 42;

将写入42位于内存块开头的 16 位字packet->payload

于 2013-07-12T16:40:27.343 回答