gpt4 book ai didi

c - 在 C 中打印 IP 版本和 IP header

转载 作者:行者123 更新时间:2023-11-30 17:43:54 25 4
gpt4 key购买 nike

我有一个用 C 语言编写数据包嗅探器的作业。当前提供的示例代码获取原始数据包并解析链路层(以太网) header ,如下所示:

struct ethernet_header {
unsigned char dest[6];
unsigned char source[6];
char proto;
}

...



const struct ethernet_header *header;
header = (const struct ethernet_header *)data_packet;

printf("Source MAC: %02x", header->source[0]);
for (i = 1; i < 6; i++) printf(":%02x", header->source[i]);
printf("\n");

...

现在我需要解析互联网层。对于互联网层,我有以下结构:

struct ip_header {
unsigned char ip_vhl; /* version << 4 | header length >> 2 */
unsigned char ip_tos; /* type of service */
unsigned char ip_len; /* total length */
...
};

现在 ip_vhl 是 8 位长,我想获取前 4 位并将其打印为版本,最后 4 位将其打印为 header 长度。你们能帮我一下吗?

还在示例代码中,他们使用 %02x 来 printf header->source[i]%hu 来 printf header ->原型(prototype)。如果有人能解释一下以及我应该使用什么样的 %.. 来 printf ip_vhl、ip_tos 和 ip_len,我将非常感激。

最佳答案

您有两个选择:

  • 要么使用位字段来描述 4 位字段。注意实现和平台相关的位和字节排序:
struct foo {
int bar:4;
int baz:4;
}
  • 或使用逻辑运算来提取位。
upper4bits = (bigvar >> 4) & 0xf; 
lower4bits = bigvar & 0xf;

关于c - 在 C 中打印 IP 版本和 IP header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20157363/

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