我有一个指向要打印其 IP 版本的原始以太网数据包的指针。我在 Linux 客户端上使用 C++。
IP 版本与 IHL(Internet Header Length)一起存储在数据包头的第 14 个字节中。我有一个打印 IP 标头中所有字段的函数,但是由于 IP 版本与 IHL 一起存储在第 14 个字节中,因此我必须打印第 14 个字节中的前 4 位,我不知道该怎么做。我想同时打印 IP 版本和 IHL。
我的功能是这样的:
int PrintIPHeader(unsigned char *eth_head)
{
unsigned char *ip_head = eth_head;
int j;
printf("---Start of IP Header---");
printf("\nVersion\n");
for(j = 0; j < 1; j++)
{
printf("%d", *(ip_head+j));
}
printf("\nIHL\n");
for(j = 0; j < 1; j++)
{
printf("%d", *(ip_head+j));
}
printf("\nToS\n");
for(j = 1; j < 2; j++)
{
printf("%d", *(ip_head+j));
}
printf("\nTotal Length\n");
for(j = 2; j < 4; j++)
{
printf("%d", *(ip_head+j));
}
...
and so and so on with all the fields of an IP header
(I know the for-loop is unnecessary in some of the cases)
}
上面的方法打印整个字节,但我想要的是它只打印前 4 位,然后我想要另一个打印第一个字节的最后 4 位的“printf”。在上述方法中,我将标头的第 14 个字节解析为参数。
有人告诉我,我可以使用以下命令将前四位切换 4 位,从而覆盖国际人道法,这不是我想要的。
printf(ip_head[14] >> 4);
但是我收到一个错误“'unsigned char *'和'int'类型的无效操作数到二进制'operator>>'”。
有人有解决方案吗?