ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュのビックエンディアンをリトルエンディアンに変換

  • mixiチェック
  • このエントリーをはてなブックマークに追加
誰か〜〜
ビックエンディアンをリトルエンディアンに変換する方法を教えてください!

コメント(8)

シフトをorで繋げればオッケーです。
よーするに

foo = (foo >> 8) | (foo << 8);

で行けるはず。
たぶん(笑)

でも大抵の標準ライブラリにエンディアン変換の命令は有ると思うのですが。
>爺さん
上記のコード、2バイトの変数限定ですか?
どういう状況で使うのか書いてませんけど。
確かに普通にライブラリにありそうな気もしますが。
適当に作ってみました。
2,4バイトの変数のみ対応で。

template<class T>
T SwapEndian( T p)
{
switch( sizeof(T))
{
case 1:
return p;
case 2:
return p = (p >> 8) | (p << 8);
break;
case 4:
{
T ret;
char* pSrc = reinterpret_cast<char*>(&p);
char* pDst = reinterpret_cast<char*>(&ret);
pDst[0] = pSrc[3];
pDst[1] = pSrc[2];
pDst[2] = pSrc[1];
pDst[3] = pSrc[0];
return ret;
}
break;
default:
printf( "SwapEndian::未対応の型です!" );
Assert(0);
break;
}

//来たら困る
Assert(0);
return p;
}
VC7以降であれば、CRTの_byteswap_ulong, _byteswap_ushort, _byteswap_uint64 を使うのがいいでしょう。
WinSockにも、htonl, htons, ntohl, ntohs がありますけど。
じゃぁ
foo = ((foo & 0x00ff00ff) << 8) | ((foo & 0xff00ff00) >> 8)
で(笑)

てか普通にやっぱライブラリ使うのが確実です(笑)
#define my_swap32(x) \
    ((((x) & 0xff000000) >> 24) | \
     (((x) & 0x00ff0000) >>  8) | \
     (((x) & 0x0000ff00) <<  8) | \
     (((x) & 0x000000ff) << 24))

#define my_swap16(x) \
    ((((x) & 0xff00) >> 8) | \
     (((x) & 0x00ff) << 8))
テンプレート関数と、社本@ワックさんのレスにあったライブラリ関数組み合わせると、使い勝手のいい関数が手軽にできそう。
さすがに、普通に使うときに、「この変数は2バイトだから…」とか考えたくないし。
テンプレートを使ってバイトスワップを実装してみました。
対応していないバイト数の場合はコンパイル時エラーになります。
※ちゃんとした実装を作るならTが整数型かどうかをチェックする必要があります。

template<typename T, unsigned int> struct byte_swap_impl;
template<typename T> struct byte_swap_impl<T,1> {
  static T swap( const T x ) {
    return x;
  }
};
template<typename T> struct byte_swap_impl<T,2> {
  static T swap( const T x ) {
    return ((x>>8)&0xff)|x<<8;
  }
};
template<typename T> struct byte_swap_impl<T,4> {
  static T swap( const T x ) {
    return(
      ((x>>24)&0x000000ff)|((x>> 8)&0x0000ff00)|
      ((x<< 8)&0x00ff0000)|((x<<24)&0xff000000)
      );
  }
};
template<typename T> T byte_swap( const T x ) {
  return byte_swap_impl<T,sizeof(T)>::swap(x);
}

int main(void) {
 char b=0x12;
 short w=0x1234;
 long d=0x12345678;
 byte_swap(b);
 byte_swap(w);
 byte_swap(d);
}

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング