gpt4 book ai didi

c - 这个宏返回什么以及如何使用它?

转载 作者:太空宇宙 更新时间:2023-11-04 06:15:00 24 4
gpt4 key购买 nike

我无法理解如何使用此宏来获取 IP header 的长度。我有一个名为 framehdr.h 的文件,我已将该文件包含在我的 main.c 中。 framehdr.h 文件中的结构如下所示:

struct ip_hdr {
unsigned char vhl; /* Version and header length */
unsigned char tos; /* Type of service */
unsigned short len; /* Total length */
unsigned short id; /* Identification */
unsigned short off; /* Fragment offset field */
unsigned char ttl; /* Time to live */
unsigned char p; /* Protocol */
unsigned short ip_sum; /* Checksum */
unsigned int src, dst; /* Source and dest address */
};

我可以通过像这样添加所有尺寸来手动获得长度:

unsigned int sizeIP = sizeof(testOne.vhl) + sizeof(testOne.tos)    +
sizeof(testOne.len) + sizeof(testOne.id) +
sizeof(testOne.off) + sizeof(testOne.ttl) +
sizeof(testOne.p) + sizeof(testOne.ip_sum) +
sizeof(testOne.src) + sizeof(testOne.dst);

但我想使用看起来像这样的宏来获取大小:

#define IP_HL(ip) ((((ip)->vhl) & 0x0f) * 4)

这个宏返回什么?它是一个数字,以便我可以将它存储在一个 int 中然后打印它,或者它是如何工作的?

最佳答案

看起来 vhl(这是一个 8 位成员,除非 CHAR_BIT 在您的平台上是一个奇怪的值)用于在有效的 4 位中存储版本,在其他位中存储 header 长度4 位。

((ip)->vhl) & 0x0f) 提取 structvhl 成员的最低 4 位ip 指向。

乘以 4 得到实际长度只是遵守该成员的约定。

您使用 sizeof 来“手动获取长度”的方式是假设 header 长度对应于各个成员的大小之和。成员 填充 和未记录的约定以用于您的 struct 的序列化技术为中心可能意味着情况并非如此。

关于c - 这个宏返回什么以及如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47809856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com