Linux Cネットワークプログラミング——1.大端数および小端数


1.バイト順
データはメモリに2種類の保存方法があります.
マクロシーケンス(Big-endian):下位バイトを上位アドレスに配置
リトルエンドシーケンス(Little-Endian):反対
x 86シリーズはlittle endian方式でデータを格納
例:0 x 12345678
データは8 bitビット単位で、メモリには以下のように格納されます.
Big Endian
低アドレス高アドレス
   ----------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     12     |      34    |     56      |     78    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Little Endian
低アドレス高アドレス
   ----------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     78     |      56    |     34      |     12    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2.ネットワーク内のバイト順
TCP/IPプロトコルでは、ネットワークデータストリームは、先に受信したものを上位に、後に受けたものを下位に置く大エンドバイトシーケンスを採用しなければならない.
3.バイト順変換
ヘッダファイル:arpa/inet.h
#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
hはhostを表し、
nはnetworkを表し、
lは32ビット長の整数を表し、
sは16ビットの短い整数を表す
eg:
#include <stdio.h>

void main()
{
	short s =  0x0102;
	short *p = &s;

	if( *( (char*)p ) == 0x01 ) 		//0x0201
		printf( "This is big-endian.
" ); else if (*( (char*)p ) == 0x02 ) //0x0102 printf( "This is little-endian.
" ); else printf( "Unknown.
" ); return 0; }

4.参考文献
[1]バイト順http://zh.wikipedia.org/wiki/%E5%A4%A7%E7%AB%AF%E5%BA%8F#.E5.A4.A7.E7.AB.AF.E5.BA.8F
[2]バイト順(Endian)、大端(Big-Endian)、小端(Little-Endian)http://www.cppblog.com/tx7do/archive/2009/01/06/71276.html