2016-03-18 21 views
2

unsigned short intの値をCで表示しようとしましたが、運が悪いです。私が知る限り、これは16ビットの値なので、この2バイトを一緒に印刷する方法をいくつか試しましたが、バイトごとに正しく印刷することができました。 Iは10進数と16進数の形式の両方で、この16ビットを印刷したい符号なしの短い整数を16進数で表示します。C

注、1例として00 01ために、別の例では、次のようになります255として00 ff

私はこの構造体を持っている:

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]; */ 
}; 

そして、この機能:

フォーマットHW:0100

フォーマットプロト

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機能は、この私を返します。 :0008

HWレン:6

プロトレン:4

コマンド:0100

構造体の六角値は "00 01 08 00 06 04 00 01" であるので、Iドンなぜそれがarp_hdr.ar_hrd値に0100を返すのか分かりません。

また、構造体を16進数で表示して、正しく処理していることを確認し、すべてのフィールドが正しく割り当てられていることを確認できました。

PS:この質問を送信する前に、正しいHex値を印刷していても乱れていることがわかりました。小さな/大きなエンディアンの「相違」に関連していますか?

+1

私はあなたが何を計算しているのか分かりませんが、 '0x00ff'は' 16'ではありません。 – EOF

+0

はい、申し訳ありませんが、コピーして貼り付けていたため、数字が乱れました。既に編集済みです。 – lpares12

答えて

3

little/bigエンディアンの "difference"に関連していますか?

はい。ネットワーク経由で到着したパケットを扱っていて、ARPパケットのフィールドを印刷している場合、それはあなたがやっていることです。フィールドのバイト順をそのまま変換する必要があるかもしれません。ネットワークを介して実行中のマシン上のバイトオーダーに送信されます。

その特定のケースで
printf("Format HW: %04x\n", ntohs(arp_hdr.ar_hrd)); 

、あなたはntohs()ビッグエンディアンのマシン上のコール(SPARC、システム/ 3x0、Z /アーキテクチャ、PowerPCの電源/ ISA AIXを実行せずに逃げることができます。たとえば

、Mac OS Xを実行しているPowerPC/Power ISA、 Linuxなどを実行するPowerPC/Power ISA)がありますが、リトルエンディアンマシン(x86-64プロセッサプロセッサ、おそらくほとんどのARMなど)。

両方のタイプのプロセッサで使用できます。

+0

ありがとう!フォーマット指定子 '%hu'と関数' ntohs() 'を使って10進数で値を出力することができました。 – lpares12

2

構造体の16進値は "00 01 08 00 06 04 00 01"なので、arp_hdr.ar_hrd値に0100が返されている理由はわかりません。

あなたのプラットフォームがリトルエンディアンシステムを使用しているようです。

メモリ内に00 01と表示されるものは、01 x 2^8 + 00と解釈されます。つまり、数値の16進表現は0100です。

2

ARPパケットは、すべてのインターネットプロトコルパケットと同様に、ビッグエンディアンである「ネットワークオーダー」で送信されます。クライアントは、ネットワーク順序からマシンのローカルバイトオーダーに変換するために、例えばntohs(ネットワーク間をホストするネットワーク)を使用しなければなりません。逆の場合はhtonsです。

詳細はman byteorderを参照してください。

関連する問題