我一直在尝试unsigned short int
用C来打印值,但是没有运气。据我所知,它是一个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:在发送此问题之前,我意识到它正在打印正确的十六进制值,但无序。可能与小/大尾数的“差异”有关吗?
可能与小/大尾数的“差异”有关吗?
是的。如果您正在处理通过网络到达的数据包-并且正在打印ARP数据包的字段,那么这正是您在做的-您可能需要从字段的字节顺序开始转换通过网络发送到您正在运行的计算机上的字节顺序。
例如:
printf("Format HW: %04x\n", ntohs(arp_hdr.ar_hrd));
在这种特殊情况下,您可以不用ntohs()
大端机(SPARC,System / 3x0,z / Architecture,运行AIX的PowerPC / Power ISA,运行Mac OS X的PowerPC / Power ISA ,可能是PowerPC / Power ISA)上的呼叫就可以摆脱困境运行Linux等),但如果没有它,就不能在低端字节序的机器上运行(装有x86处理器的任何产品,包括x86-64处理器,可能是大多数ARM等)。
您可以在两种类型的处理器上使用它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句