我有一个在C中编写数据包嗅探器的任务。目前提供的示例代码获取原始数据包并解析链路层(以太网)标头,如下所示:
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");
...
现在我需要解析互联网层。 对于Internet Layer,我有以下结构:
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位将其作为标题长度打印。你能帮助我吗?
同样在示例代码中,他们使用%02x
来printf header->source[i]
和%hu
来printf header->proto
。我真的很感激,如果有人能够解释它,我应该使用什么样的%..
来打印ip_vhl,ip_tos和ip_len。
答案 0 :(得分:0)
您有两种选择:
struct foo { int bar:4; int baz:4; }
upper4bits = (bigvar >> 4) & 0xf; lower4bits = bigvar & 0xf;