大小端模式(BIG-ENDIAN、Little-ENDIAN)

来源:互联网 发布:linux badzip 编辑:程序博客网 时间:2024/05/16 05:41
在做网络编程时、经常会用到htons() ntohl()这种函数。

大端模式
所谓的大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
即:一个字(word,两个字节)的高位字节存放数字的低位、低位字节存放数字的高位
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在大端模式下,前16位应该这样读: e684

小端模式
所谓的小端模式,是指数据的高位保存在内存的高地址中,而数 据的低位保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在小端模式下,前16位应该这样读: 84e6



下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元
若x0=0x11,则是大端; 若x0=0x22,则是小端......
上面的程序还可以看出,数据寻址时,用的是低位字节的地址。


htons():主机字节序转化为网络字节序(网络字节序是机器无关的、大端模式) 
ntohl():网络字节序转化为主机字节序。
在网络编程时、这两个函数实际上就是隐藏大端/小段这样的概念,统一处理,在发送时转化为网络字节序,接收到之后
转化为主机字节序以便本机识别。


0 0
原创粉丝点击