2012/02/10

リトルエンディアン・バイトエンディアン バイトオーダー相互変換関数

PSDを読み込むとき、バイトオーダーがビッグエンディアンなので自前でリトルエンディアン・ビッグエンディアンの相互変換マクロを作って読み込み・書き込みをしていたが、どうも標準でCライブラリに搭載されているらしい。

  「リトルエンディアン」 「ビッグエンディアン」 のキーワードで検索するから見つからないらしく、これらの別名として 「ホストバイトオーダー」 「ネットワークバイトオーダー」 というキーワードがあり、こちらで検索すると相互変換関数が見つかる。



 それでも用意されている関数だけだと16bit(2byte)と32bit(4byte)の値しか扱えないので、自前で実装する余地が残っているのが救いか?

ネットワークバイトオーダー<->ホストバイトオーダー変換関数(BYTEORDER関数)




  • #include <arpa/inet.h>

  • u_long htonl (u_long hostlong) : 32 ビットホストバイトオーダーをネットワークバイトオーダーに変換します

  • u_short htons (u_short hostshort) : 16 ビットホストバイトオーダーをネットワークバイトオーダーに変換します

  • u_long ntohl (u_long netlong) : 32 ビットネットワークバイトオーダーをホストバイトオーダーに変換します

  • u_short ntohs (u_short netshort) : 16 ビットネットワークバイトオーダーをホストバイトオーダーに変換します


 また、隣接するバイトを変換するswab(swap byte)関数が用意されている。



  • #include <string.h>

  • void swab(const void *from, void *to, size_t n) : from で指された配列から n バイトを to で指された配列に、隣接した偶数/奇数バイトを交換しながらコピーする。この関数は異なるバイトオーダーを持つマシン間でのデータ交換に使用される

0 件のコメント:

コメントを投稿