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 C网络编程中关于字节序的基础知识,包括大端序(Big-Endian)和小端序(Little-Endian)的概念,以及TCP/IP协议规定的网络字节序。同时,提到了在编程中进行字节序转换的方法,如使用arpa/inet.h头文件中的函数。

1435

被折叠的 条评论
为什么被折叠?



