Kodama's home / tips.
例えば, 4バイトの数値 0x04030201 をメモリーに格納した場合以下のようになる. (c.f. endian.h)
メモリーの内容をネットワークにバイト列として送り出す場合, メモリの先頭バイト(下位アドレス)から順に送りだされる. アーキテクチャが異なるホスト間で数値データを送る場合, どのようなバイト順でデータを扱うか統一しておかないと通信の内容に矛盾がでてしまう. そこで, INET プロトコルのネットワークバイトオーダー(ネットワーク上でのバイトオーダー)として big endian を使うように取り決めている.
ホストバイトオーダーとネットワークバイトオーダーの間で値を変換する手段として, 4バイト値には htonl と ntohl, 2バイト値には htons と ntohs がある.
int x=1; // 0x00000001 if (*(char*)&x) { /* little endian. memory image 01 00 00 00 */ }else{ /* big endian. memory image 00 00 00 01 */ }
他の環境でも同様に __*_ENDIAN__ を define するには, c コンパイラに -D__BIG_ENDIAN__ などとパラメータとして与えるか, 適当な *.h ファイルで define すると良い. また, *ENDIAN__ を自動的に define するには, 以下のようにすると良い.
#include <endian.h> #if !defined(__LITTLE_ENDIAN__) and !defined(__BIG_ENDIAN__) #if __BYTE_ORDER == __LITTLE_ENDIAN #define __LITTLE_ENDIAN__ #elif __BYTE_ORDER == __BIG_ENDIAN #define __BIG_ENDIAN__ #endif #endif
#include <stdbool.h> bool sys_is_little_endian(){ #if defined(__LITTLE_ENDIAN__) return true; #elif defined(__BIG_ENDIAN__) return false; #else int i = 1; return (bool)(*(char*)&i); #endif }
Kodama's home / tips.