久々のプログラミングねた。
Cの型で、unsignedとかsignedってあるじゃん。あれと同じような感じでnetworkっていう修飾できないかなー、なんて思ったりして。
つまりネットワークバイトオーダーを修飾子としてつけたいわけだ。
IA32 endianなアーキテクチャの場合(big/littleどっちか忘れたけどたしかlittleだったような気がするな)、
network int a_n; int a=1; a_n=a; printf("a_n=%d, a=%d\n", a_n, a);
の場合は微妙だがprintf
が型変換しないとして、
a_n=16777216, a=1
と出力され、printf("a_n=%d, a=%d\n", (int)a_n, a);
の場合は
a_n=1, a=1
と出力される。つまりhtonX
やntohX
をキャストだけでやってほしいわけ。htonl
でも戻ってくるのはint(long)であって、処理しているものがどっちのバイトオーダーかを判別するくらいコンパイラがやってくれても罪にはなるまい。ネットワークバイトオーダー型のままで四則演算したいこともあるしさ。キャストでbyteswap
が勝手に走る。64bitのntohll
(だっけ? FreeBSDのnetinet/in.hにはあったような気がするがLinuxのにはない)がない処理系でも問題がなくなる。いいことずくめだ。
これは別にCじゃなくてもいいけどね。C++ならクラスとして書けるか。しかし中身のないクラスになるだろうな。むしろテンプレートかな。