【问题标题】:Print unsigned short int in hex and decimal C以十六进制和十进制 C 打印 unsigned short int
【发布时间】:2016-03-19 01:59:21
【问题描述】:

我一直试图在 C 中打印 unsigned short int 值,但没有成功。据我所知,这是一个 16 位的值,所以我尝试了几种不同的方法将这 2 个字节一起打印,但我只能在逐字节打印时正确打印。

请注意,我想以十进制和十六进制格式打印这 16 位,例如 00 01 为 1,另一个示例是:00 ff 为 255。

我有这个结构:

struct arphdr {
   unsigned short int ar_hrd;
   unsigned short int ar_pro;
   unsigned char ar_hln;
   unsigned char ar_pln;
   unsigned short int ar_op;
   // I'm commenting the following part because I won't need it now
   // for the explanation
   /* unsigned char __ar_sha[ETH_ALEN];
   unsigned char __ar_sip[4];
   unsigned char __ar_tha[ETH_ALEN];
   unsigned char __ar_tip[4]; */ 
};

还有这个功能:

void print_ARP_msg(struct arphdr arp_hdr) {
   // I need to print the arp_hdr.ar_hrd in both decimal and hex.
   printf("Format HW: %04x\n", arp_hdr.ar_hrd);
   printf("Format Proto: %04x\n", arp_hdr.ar_pro);
   printf("HW Len: %x\n", arp_hdr.ar_hln);
   printf("Proto Len: %x\n", arp_hdr.ar_pln);
   printf("Command: %04x\n", arp_hdr.ar_op);
}

print_ARP_msg 函数返回给我这个:

格式化硬件:0100

格式原型:0008

硬件长度:6

原镜头:4

命令:0100

结构的十六进制值是“00 01 08 00 06 04 00 01”,所以我不知道为什么它在 arp_hdr.ar_hrd 值中返回 0100。

另外,我创建了一个以十六进制打印结构的函数,以确保我做得正确,并且我能够检查所有字段是否正确分配。

PS:在发送这个问题之前,我意识到它正在打印正确的十六进制值但无序。会不会和小/大端“差异”有关?

【问题讨论】:

  • 我不知道你在计算什么基础,但0x00ff 不是16。
  • 是的,抱歉,我在复制粘贴,弄乱了数字。已编辑。

标签: c printf unsigned-integer


【解决方案1】:

会不会和小/大端“差异”有关?

是的。如果您正在处理通过网络到达的数据包 - 并且您正在打印 ARP 数据包的字段,那么这正是您正在做的 - 您可能必须从字段的字节顺序转换为通过网络发送到您正在运行的机器上的字节顺序。

例如:

printf("Format HW: %04x\n", ntohs(arp_hdr.ar_hrd));

在这种特殊情况下,您无需在大端机器(SPARC、System/3x0、z/Architecture、运行 AIX 的 PowerPC/Power ISA、运行 Mac OS X 的 PowerPC/Power ISA)上调用 ntohs() , 可能 PowerPC/Power ISA 运行 Linux 等),但在 little-endian 机器上没有它你就无法逃脱(任何带有 x86 处理器的机器,包括 x86-64 处理器,可能大多数ARM 等)。

您可以在两种类型的处理器上使用它。

【讨论】:

  • 谢谢!我能够使用格式说明符%hu 和函数ntohs() 打印十进制值。
【解决方案2】:

结构的十六进制值是“00 01 08 00 06 04 00 01”,所以我不知道为什么它在 arp_hdr.ar_hrd 值中返回 0100。

看起来您的平台使用的是小端系统。

内存中的00 01 被解释为01 x 2^8 + 00。换句话说,数字的十六进制表示是0100。

【讨论】:

    【解决方案3】:

    ARP 数据包与所有互联网协议数据包一样,以“网络顺序”传输,即大端。例如,客户端必须使用ntohs(网络到主机的简称)将网络顺序转换为机器的本地字节顺序,而htons则相反。

    详情请见man byteorder。

    【讨论】:

      猜你喜欢
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 2011-12-09
      相关资源
      最近更新 更多