C言語で構造体のネットワークバイトオーダー変換
以下のような構造体があるのですが、
ビッグエンディアン、リトルエンディアン関係なく、
ネットワークバイトオーダーへ変換できる(もしくは型定義できる)コードを書きたいと思っています。
[構造体]
struct sample {
unsigned short a:12;
unsigned short b:2;
unsigned short c:2;
};
↓これで問題ないですか?
struct sample val = {300,1,2};
htons((uint16_t)val);
もしくは、以下のように定義すれば、htons()で変換しなくても大丈夫でしょうか?
struct sample {
#if __BYTE_ORDER == __LITTLE_ENDIAN
unsigned short a1:8; /* aの前半 */
unsigned short c:2;
unsigned short b:2;
unsigned short a2:4; /* aの後半 */
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
/* ビッグエンディアンならそのまま流してOK? */
unsigned short a:12;
unsigned short b:2;
unsigned short c:2;
#endif
};
ビットフィールドが8以下で、バイトの区切りをまたがなければ