Linux Cネットワークプログラミング——1.大端数および小端数
1684 ワード
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
nはnetworkを表し、
lは32ビット長の整数を表し、
sは16ビットの短い整数を表す
eg:
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
データはメモリに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