预备概念:
Big-Endian和Little-Endian
定义如下:
1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:
1)大端模式:
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12
顺带讲一下大小端各自的优势:
小端模式 :强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。
大端模式 :符号位的判定固定为第一个字节,容易判断正负。
这里解释下:当较低类型的数据转换为较高类型时,一般只是形式上有所改变, 而不影响数据的实质内容, 而较高类型的数据转换为较低类型时则可能有些数据丢失。当我们把一个int型强制转化为byte时,由于byte只有1个字节,而int型是4个字节,这样就会产生截断,int把它最低的内存空间里的值放到了byte所对应的内存空间里。内存地址是由上到下有从左至右依次递增的,小端字节序指低字节位数据存放在内存低地址处, 高字节位数据存放在内存高地址处; 大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。x86的CPU体系结构中,就是使用小端字节序,即低字节数据存放在低地址处,高字节数据存放在高地址处。将int型的数据转化成char型的数据时,我们只取低8位;如果我们的CPU是小端模式,则我们在进行强制类型转换时不需要调整字节内容,非常的方便;如果我们的CPU是大端模式,则我们,需要将高字节地址的数据存入低字节地址,也就是需要调整字节内容。
从软件的角度上,不同端模式的处理器进行数据传递时必须要考虑端模式的不同。如进行网络数据传递时,必须要考虑端模式的转换。在Socket接口编程中,以下几个函数用于大小端字节序的转换。
1 #define ntohs(n) //16位数据类型网络字节顺序到主机字节顺序的转换 2 #define htons(n) //16位数据类型主机字节顺序到网络字节顺序的转换 3 #define ntohl(n) //32位数据类型网络字节顺序到主机字节顺序的转换 4 #define htonl(n) //32位数据类型主机字节顺序到网络字节顺序的转换
其中互联网使用的网络字节顺序采用大端模式进行编址,而主机字节顺序根据处理器的不同而不同,如PowerPC处理器使用大端模式,而Pentuim处理器使用小端模式。
更多详细请参考:http://blog.csdn.net/ce123_zhouwei/article/details/6971544
- #define ntohs(n) //16位数据类型网络字节顺序到主机字节顺序的转换
- #define htons(n) //16位数据类型主机字节顺序到网络字节顺序的转换
- #define ntohl(n) //32位数据类型网络字节顺序到主机字节顺序的转换
- #define htonl(n) //32位数据类型主机字节顺序到网络字节顺序的转换