Linux C 网络编程——1. 大端序和小端序

1. 字节序

数据在内存中有2种存放方式:

大端序(Big-Endian):低位字节放在高位地址

小端序(Little-Endian):相反

x86系列则采用little endian方式存储数据

如:0x12345678

数据以8bit位单位,在内存中的存储如下:

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.\n" );
	else if (*( (char*)p ) == 0x02 )	//0x0102
		printf( "This is little-endian.\n" );
	else
		printf( "Unknown.\n" );

	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







你可能感兴趣的:(linux,网络编程,big-endian,little-endian)