在下面的代码中:

struct ip_header {
        unsigned char ip_hl:4;
        unsigned char ip_ver:4;
        unsigned char ip_dscp:6;
        unsigned char ip_ecn:2;
        unsigned int ip_len;
        unsigned int ip_id;
...
};
...

const struct ip_header * ip_hdr = (const struct ip_header *)(buffer + ETHERNET_HEADER_SIZE);

...

printf("IP DSCP: %u\n", ip_hdr->ip_dcsp);
printf("IP Total Length: %u bytes\n", ip_hdr->ip_len);

...


通常我有IP DSCP = 0,并且IP总长度是某个数字< 65535

每当我得到IP DSCP = 8时,总长度就会变成7位数字,即4231532字节。

但是我们知道unsigned int范围在0到65535之间。

有人可以解释这里发生了什么吗?IP DSCP = 8是什么意思?还是我错过了IP标头长度和IP DSCP之间的某个字段?谢谢

最佳答案

您对诸如int之类的数据类型的长度的假设是错误的。它们是实现定义的。

如果您需要变量的位数明确定义,则可以使用

uint16_t
int16_t


如果您#include <stdint.h>,则可用。

关于c - IP DSCP = 8使IP总长度为7位数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20164009/

10-12 16:06