【问题标题】:parsing unsigned char pointer to bit operand c++将无符号字符指针解析为位操作数c ++
【发布时间】:2013-11-11 10:51:51
【问题描述】:

我有一个指向要打印其 IP 版本的原始以太网数据包的指针。我在 Linux 客户端上使用 C++。

IP 版本与 IHL(Internet Header Length)一起存储在数据包头的第 14 个字节中。我有一个打印 IP 标头中所有字段的函数,但是由于 IP 版本与 IHL 一起存储在第 14 个字节中,因此我必须打印第 14 个字节中的前 4 位,我不知道该怎么做。我想同时打印 IP 版本和国际人道法。

我的功能是这样的:

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”打印第一个字节的最后 4 位。在上述方法中,我将标头的第 14 个字节解析为参数。

有人告诉我,我可以使用以下命令将前四位切换 4 位,从而覆盖国际人道法,这不是我想要的。

printf(ip_head[14] >> 4); 

但我收到错误“'unsigned char *' 和 'int' 类型的无效操作数到二进制 'operator>>'”。

有人有解决办法吗?

【问题讨论】:

  • 不相关:执行此操作的循环:for(j = 0; j &lt; 1; j++) 对我来说似乎毫无意义。然而,这似乎是这个来源中反复出现的主题。奇数。
  • @WhozCraig 我刚刚对大型代码 sn-ps 进行了快速复制粘贴,最后编写了完全不必要的 for 循环,我也在代码 sn-p 中编写了它。没有必要真正指出这一点..
  • 为什么ip_head[14] 是一个指针?根据显示的代码,它是unsigned char 类型的值。
  • @usr 我不太明白你在说什么?你必须详细说明..
  • @Zeliax 错误消息说它是unsigned char *。你不同意吗?为什么这么说?

标签: c++ linux pointers binary


【解决方案1】:

如果你使用这个命令

printf(ip_head[14] >> 4); 

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

printf(a + 4);

a 仍然像以前一样保存值,但 printf 被交给了 a+4 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多