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 をグーグルで見つけようとしましたが、うまくいきませんでした。非推奨ですか?