2

Debian 7.0.0 の CodeBlocks 10.05 で g++ を使用しています。

90 年代に、4 バイト整数のバイト順を逆にする次の関数を書きました。

/*******************************/
 void ByteSwapInt(int *ipInteger)
/*******************************/
 {
    int iBuffer;

    _swab( (char *)ipInteger, (char *)&iBuffer, 4 );
    swaw((char *)&iBuffer, (char *)ipInteger, 4);
 }

最近まで、それは機能していました。しかし、saw が何もしていないように見えることに気付きました。上記の関数を展開して *ipInteger と iBuffer の個々のバイトの配列を作成し、何が起こっているかを確認しました。

/*******************************/
 void ByteSwapInt(int *ipInteger)
/*******************************/
 {
     int iBuffer;
     int Int[4], Buf[4];

    (Int[0]) = (*ipInteger >> 24) & 0xff;  // high-order (leftmost) byte: bits 24-31
    (Int[1]) = (*ipInteger >> 16) & 0xff;  // next byte, counting from left: bits 16-23
    (Int[2]) = (*ipInteger >>  8) & 0xff;  // next byte, bits 8-15
    (Int[3]) = *ipInteger         & 0xff;

    _swab( (char *)ipInteger, (char *)&iBuffer, 4 );
    (Buf[0]) = (iBuffer >> 24) & 0xff;  // high-order (leftmost) byte: bits 24-31
    (Buf[1]) = (iBuffer >> 16) & 0xff;  // next byte, counting from left: bits 16-23
    (Buf[2]) = (iBuffer >>  8) & 0xff;  // next byte, bits 8-15
    (Buf[3]) = iBuffer         & 0xff;
    swaw((char *)&iBuffer, (char *)ipInteger, 4);
    (Int[0]) = (*ipInteger >> 24) & 0xff;  // high-order (leftmost) byte: bits 24-31
    (Int[1]) = (*ipInteger >> 16) & 0xff;  // next byte, counting from left: bits 16-23
    (Int[2]) = (*ipInteger >>  8) & 0xff;  // next byte, bits 8-15
    (Int[3]) = *ipInteger         & 0xff;
 }

*ipInteger の内容は変わりません。私は言葉を交換するための swaw をグーグルで見つけようとしましたが、うまくいきませんでした。非推奨ですか?

4

2 に答える 2

3

必要なネットワーキングhtonlhtonsおよびそのコンパニオンntohlである およびntohsは、32 ビットおよび 16 ビット整数のホストからネットワークへの変換、およびネットワークからホストへの変換です。これらは、使用しているアーキテクチャに合わせて適切に定義されます。したがって、SPARC ではノーオペレーション (ビッグエンディアン プラットフォーム) になり、x86 ではスワップとして実装されます。彼らは、<arpa/inet.h>または出身です<netinet/in.h>

于 2013-06-04T02:36:32.090 に答える
0

私が見つけた最も簡単な解決策は、こちらで説明されている FIX_INT(x) を使用することでした。

于 2013-06-04T02:14:07.657 に答える