我有一个指向我要打印IP版本的原始以太网数据包的指针。我在Linux客户端上使用C ++。
IP版本与IHL(Internet标头长度)一起存储在数据包标头的第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位然后我想要另一个“printf”打印第1个字节的4个最后一位。在上面的方法中,我将头的第14个字节解析为参数。
有人告诉我,我可以使用以下方法将前四位切换为4位,从而覆盖国际人道法,这不是我想要的。
printf(ip_head[14] >> 4);
但是我收到错误“无效的操作数类型'unsigned char *'和'int'到二元'运算符&gt;&gt;'”。
有人有解决方案吗?
答案 0 :(得分:1)
如果您使用此命令
printf(ip_head[14] >> 4);
这些位不会被永久覆盖。 您可以将行为与
进行比较printf(a + 4);
如果仍像以前一样保持该值,但printf将被移交一个+4的值。