将unsigned char指针解析为位操作数c ++

时间:2013-11-11 10:51:51

标签: c++ linux pointers binary

我有一个指向我要打印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;'”。

有人有解决方案吗?

1 个答案:

答案 0 :(得分:1)

如果您使用此命令

printf(ip_head[14] >> 4); 

这些位不会被永久覆盖。 您可以将行为与

进行比较
printf(a + 4);

如果仍像以前一样保持该值,但printf将被移交一个+4的值。