以十六进制和十进制 C 打印 unsigned short int

lpa*_*s12 3 c printf unsigned-integer

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

请注意,我想以十进制和十六进制格式打印这 16 位,例如00 01as 1,另一个示例是:00 ffas 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]; */ 
};
Run Code Online (Sandbox Code Playgroud)

而这个功能:

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);
}
Run Code Online (Sandbox Code Playgroud)

print_ARP_msg 函数返回给我:

格式硬件:0100

格式原:0008

硬件长度:6

原型镜头:4

命令:0100

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

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

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

小智 5

它可能与小/大端“差异”有关吗?

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

例如:

printf("Format HW: %04x\n", ntohs(arp_hdr.ar_hrd));
Run Code Online (Sandbox Code Playgroud)

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

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