您的位置:首页 > 理论基础 > 计算机网络

大端小端 主机字节序 网络字节序

2016-04-11 15:24 357 查看
 1.    大小端概念

大端:数据的高字节保存在低地址空间,低字节保存在高地址空间

小端:数据的高字节保存在高地址空间,低字节保存在低地址空间

2.    为什么会有大小端

在计算机中,以字节为单位进行存储数据,一个字节占8位。

(1)  数据除了8位的char类型,还有16位的short,32位的int、long等

(2)  对于大于8位的CPU,如32位CPU,寄存器超过一个字节

由于以上两点原因,所以存在对于多个字节的数据如何进行排放问题,也就存在大端小端。

3.    大小端数据存放举例

对于16位的数据0x1122,高字节数据为11,低字节数据为22.

 低地址空间高地址空间
大端1122
小端2211
4.    如何测试编译器是大端还是小端

#include<stdio.h>
int main()
{
short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0];  //低地址单元
x1=((char*)&x)[1];  //高地址单元
printf("x0=0x%x,x1=0x%x",x0,x1);// 若x0=0x11,则是大端; 若x0=0x22,则是小端
return 0;
}

5. 主机字节序和网络字节序

不同平台上主机字节序不同,可能为大端也可能为小端。在80x86平台上使用小端序列,即低字节保存在低地址位,高字节保存在高地址位。

那么网络字节序采用哪种方式呢?网络数据流以字节流的形式传输,在接收端,当收到数据后,将收到的第一个字节保存在高位;而发送端所发送的第一个字节为内存低地址空间数据。因此,在发送多字节数据时,应该将数据以大端形式保存,即网络字节序为大端。

由于网络字节序统一为大端,而主机字节序不统一,因此,在网络数据传输前,需要对主机序列进行转换再传输,主机收到网络数据后同样需要将网络字节序转换为主机字节序。

主机字节序 -> 网络字节序:htons, htonl,分别将16位和32位的主机字节序转换为网络字节序。

网络字节序 -> 主机字节序:ntohs, ntohl,分别将16位和32位的网络字节序转换为主机字节序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: