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

时间:2016-03-18 17:43:08

标签: c printf unsigned-integer

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

请注意,我想以十进制和十六进制格式打印此16位,例如00 011,另一个示例为:00 ff255

我有这个结构:

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函数返回我:

  

格式化HW:0100

     

格式原型:0008

     

HW Len:6

     

Proto Len:4

     

命令:0100

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

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

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

有关

3 个答案:

答案 0 :(得分:3)

  

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

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

例如:

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

在这种特殊情况下,你可以在大端机器(SPARC,System / 3x0,z / Architecture,运行AIX的PowerPC / Power ISA,运行Mac的PowerPC / Power ISA)上没有ntohs()调用的情况下离开操作系统X,可能运行Linux的PowerPC / Power ISA等),但是如果没有它在小端机器上(任何带有x86处理器的东西,包括x86-64处理器,都无法逃脱)可能是大多数ARM等。)。

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

答案 1 :(得分:2)

  

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

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

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

答案 2 :(得分:2)

与所有互联网协议数据包一样,ARP数据包以“网络顺序”传输,这是大端的。例如,客户端必须使用ntohs(网络到主机短路)从网络顺序转换为机器的本地字节顺序,而htons则转向另一种方式。

有关详细信息,请参阅man byteorder