今回のテーマは元ネタがよくわからない状態になってしまっています。それはそれとして、当サイトでは独自路線で進むことにします。元ネタにもあるように、バイト逆順にするだけなら簡単なことですので。
0 1 2 3 4 5 6 7 8 9 10 |
template<class T> T reverse_endian(T value) { static_assert(std::is_scalar<T>::value, "T must be scalar type."); unsigned char * first = reinterpret_cast<unsigned char*>(&value); unsigned char* last = first + sizeof(T); std::reverse(first, last); return value; } |
コンセプトを使ってもよかったのですが、今回はなるべく古いバージョンのC++でもコンパイルできるようにしました。C++11以降でOKなはずです。それより古いバージョンのC++を使う場合にはstatic_assertの行の削除してください。
制約としては、エンディアンを反転した際に詰め物ビットの位置が上位⇔下位に入れ替わるような場合には対応していません。また、static_assertでもチェックしているように、型Tはスカラ型でなければなりません。