キノコの自省録

テクノロジーとコンテンツの融合を目指して

【C++】バイトオーダーの変換


2013/03/20:
ソースのリンクが切れています。
こちらへどうぞ。

http://d.hatena.ne.jp/kinokorori/20130320/1363748729

バイトオーダーの変換を行うことのできる、
C/C++の標準ライブラリ関数は、
swabとstd::reverse_copyの2つがあります。
どちらを用いるにしても、キャストがどうしても多くなります。
キャストが多いと、可読性の低下にも繋がります。
また、プリミティブ型の入力をわざわざポインタで渡すのは、いろいろな意味で無駄です。
さらに、ポインタ型やクラス型も渡すことが出来てしまいます。
通常、ポインタやクラスオブジェクトを逆のオーダーにしようとは考えません。
むしろ、ポインタやクラスオブジェクトがこれらの関数に渡された場合、
誤った操作だと考えた方が良いのでしょう。
また、htonsやhtonlなどの関数もありますが、
これらを用いた場合、64bit型の変数の変換を行うのに、
ちょっと工夫が必要になります。

そういうわけで、作成したのがswapByteOrderです。
SwapByteOrder.h
使い方は簡単です。

int a = 0x11223344;
int b = swapByteOrder(a);
fprintf(stderr, "0x%X\n", b);

boostをインストールしている場合は、
USE_BOOSTをdefineすると、
算術型しか受け付けなくなります。
(他の型を渡すとコンパイルエラーとなります。)
boostがインストールできない環境の場合、
ポインタ型やクラス型が渡されても、
残念ながらそのまま通ってしまいます。
非標準ですが、
関数テンプレートの部分的な特殊化を許可するコンパイラであれば、
ポインタ型は簡単に排除することができます。
ちなみに、boostを利用したswapByteOrderでは、
この問題を、オーバーロードで解決しています。