1. 主机序

不同的CPU有不同的字节序类型这些字节序是指整数在内存中保存的顺序,这个叫做主机序。最常见的有两种:

1.         Little endian:将低序字节存储在起始地址。 即小端模式

2.         Big endian:将高序字节存储在起始地址。    即大端模式

LE little-endian

最符合人的思维的字节序。地址低位存储值的低位,地址高位存储值的高位。怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说低位值小,就应该放在内存地址小的地方,也即内存地址低位;反之,高位值就应该放在内存地址大的地方,也即内存地址高位。

BE big-endian

最直观的字节序。地址低位存储值的高位,地址高位存储值的低位。为什么说直观,不要考虑对应关系。只需要把内存地址从左到右按照由低到高的顺序写出,把值按照通常的高位到低位的顺序写出,两者对照,一个字节一个字节的填充进去。

例子:在内存中双字0x01020304(DWORD)的存储方式:

内存地址

4000 4001 4002 4003

LE   04   03   02   01

BE   01   02   03   04

例子:1.如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为:

big-endian  little-endian

0x0000  0x12     0xcd

0x0001  0x23      0xab

0x0002  0xab      0x34

0x0003  0xcd      0x12

x86系列CPU都是little-endian的字节序。

二、网络序

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。

为了进行转换 bsd socket提供了转换的函数有下面四个:

1.     htons 把unsigned short类型从主机序转换到网络序。

2.     htonl 把unsigned long类型从主机序转换到网络序。

3.     ntohs 把unsigned short类型从网络序转换到主机序。

4.     ntohl 把unsigned long类型从网络序转换到主机序。

在使用little endian的系统中这些函数会把字节序进行转换,在使用big endian类型的系统中这些函数会定义成空宏。同样在网络程序开发时或是跨平台开发时,也应该注意保证只用一种字节序,不然两方的解释不一样就会产生bug。

1.     网络与主机字节转换函数:htons ntohs htonl ntohl (s就是short,l是long,h是host,n是network)

2.     不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表

处理器    操作系统    字节排序

Alpha    全部    Little endian

HP-PA    NT    Little endian

HP-PA    UNIX    Big endian

Intelx86    全部    Little endian <-----x86系统是小端字节序系统

Motorola680x()    全部    Big endian
MIPS    NT    Little endian
MIPS    UNIX    Big endian
PowerPC    NT    Little endian
PowerPC    非NT    Big endian  <-----PPC系统是大端字节序系统
RS/6000    UNIX    Big endian
SPARC    UNIX    Big endian
IXP1200 ARM核心    全部    Little endian

三、一些注意点

1.BIG-ENDIAN、LITTLE-ENDIAN跟多字节类型的数据有关的比如int,short,long型,而对单字节数据byte却没有影响。BIG-ENDIAN就是低位字节排放在内存的高端,高位字节排放在内存的低端。而LITTLE-ENDIAN正好相反。

  比如 int a = 0x05060708

  在BIG-ENDIAN的情况下存放为:

  字节号 0 1 2 3

  数据 05 06 07 08

  在LITTLE-ENDIAN的情况下存放为:

  字节号 0 1 2 3

  数据 08 07 06 05

  2.BIG-ENDIAN、LITTLE-ENDIAN、跟CPU有关的,每一种CPU不是BIG-ENDIAN就是LITTLE- ENDIAN、。IA架构的CPU中是Little-Endian,而PowerPC 、SPARC和Motorola处理器。这其实就是所谓的主机字节序。而网络字节序是指数据在网络上传输时是大头还是小头的,在Internet的网络字节序是BIG-ENDIAN。所谓的JAVA字节序指的是在JAVA虚拟机中多字节类型数据的存放顺序,JAVA字节序也是BIG-ENDIAN。

  3.所以在用C/C++写通信程序时,在发送数据前务必用htonl和htons去把整型和短整型的数据进行从主机字节序到网络字节序的转换,而接收数据后对于整型和短整型数据则必须调用ntohl和ntohs实现从网络字节序到主机字节序的转换。如果通信的一方是JAVA程序、一方是 C/C++程序时,则需要在C/C++一侧使用以上几个方法进行字节序的转换,而JAVA一侧,则不需要做任何处理,因为JAVA字节序与网络字节序都是 BIG-ENDIAN,只要C/C++一侧能正确进行转换即可(发送前从主机序到网络序,接收时反变换)。如果通信的双方都是JAVA,则根本不用考虑字节序的问题了。

  4.如果网络上全部是PowerPC,SPARC和Motorola CPU的主机那么不会出现任何问题,但由于实际存在大量的IA架构的CPU,所以经常出现数据传输错误。

  5.如果程序运行在X86架构的PC SERVER上,发送数据的一端用C实现的,接收一端是用JAVA实现的,而发送端在发送数据前未进行从主机字节序到网络字节序的转换,这样接收端接收到的是LITTLE-ENDIAN的数据,数据解释自然出错。

  

四、引用他人的

http://blog.csdn.net/xuyanbo2008/article/details/7458007

一、大端模式&小端模式

所谓的“大端模式”,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;

所谓的“小端模式”,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

如果将一个32位的整数0x12345678 存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。为简单起见,本文使用OP0表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。

地址偏移        大端模式       小端模式 
0x00           12(OP0)      78(OP3) 
0x01           34(OP1)      56(OP2) 
0x02           56(OP2)      34(OP1) 
0x03           78(OP3)      12(OP0)

小端:较高的有效字节存放在较高的存储器地址,较低的有效字节存放在较低的存储器地址。
大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。

采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将高位存放在高地址。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。到目前为止,采用大端或者小端进行数据存放,其孰优孰劣也没有定论。

下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:

short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元
若x0=0x11,则是大端; 若x0=0x22,则是小端......
上面的程序还可以看出,数据寻址时,用的是低位字节的地址

二、主机序&网络序

不同的 CPU 有不同的字节序类型这些字节序是指整数在内存中保存的顺序这个叫做主机序,最常见的有两种: 
1、Little endian :将低序字节存储在起始地址 
2、Big endian :将高序字节存储在起始地址

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。

为了进行转换 bsd socket提供了转换的函数 有下面四个:
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序

在使用little endian的系统中,这些函数会把字节序进行转换 
在使用big endian类型的系统中,这些函数会定义成空宏

同样,在网络程序开发时,或是跨平台开发时,也应该注意保证只用一种字节序,不然两方的解释不一样就会产生BUG。

注:
1、网络与主机字节转换函数:htons ntohs htonl ntohl (s 就是short l是long h是host n是network)
2、不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表:

处理器             操作系统     字节排序
Alpha                   全部      Little endian
HP-PA                    NT       Little endian
HP-PA                   UNIX     Big endian
Intelx86                全部     Little endian <-----x86系统是小端字节序系统
Motorola680x()          全部    Big endian
MIPS                     NT       Little endian
MIPS                    UNIX    Big endian
PowerPC                  NT     Little endian
PowerPC                 非NT    Big endian   <-----PPC系统是大端字节序系统
RS/6000                 UNIX    Big endian
SPARC                   UNIX    Big endian
IXP1200 ARM核心         全部      Little endian

下面是一个检验本机字节序的简便方法:

//判断本机的字节序
//返回true表为小段序。返回false表示为大段序
bool am_little_endian ()
{
unsigned short i=1;
return (int)*((char *)(&i)) ? true : false;
}
int main()
{
   if(am_little_endian())
{
            printf("本机字节序为小段序!\n");
}
else
{
          printf("本机字节序为大段序!\n");
}
        return 0;
}

三、入栈地址高低问题

堆栈是在内存中指定的一段特殊存储区,存起始单元的地址叫栈底,当前存储单元地址叫栈顶,堆栈存储区一旦指定,栈底就固定不变了,而栈顶是随入栈、出栈操作呈动态。而不同机型的堆栈设计,有两种情况:一是每入栈一个数,栈顶地址加1,每出栈一个数,栈顶地址减1,即堆栈区是由内存的低地址向高地址。另一种是每入栈一个数,栈顶地址减1,每出栈一个数,栈顶地址加1,即堆栈区是由内存的高地址向低地址。高地址、低地址是相对而言,即相对地址编码的大小而言。

大端模式小端模式 主机序网络序相关推荐

  1. 大端模式小端模式、主机序网络序、入栈地址高低问题

    一.大端模式&小端模式 所谓的"大端模式",是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把 ...

  2. 大端模式-小端模式详解

    大端模式(big endian),小端模式(little endian)指的是什么? 端(endian)模式是指计算机中字节的存储顺序.地址的高低与字节的高位和低位的对应关系就有了大端和小端的区别. ...

  3. 大端模式小端模式详解(不懂你打我,略略~~)

    大端模式小端模式详解(不懂你打我,略略~~) 先看概念 大端模式(Big-Endian),是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作 ...

  4. 网络通信时字节序转换原理与网络字节序、大端和小端模式 .

    引言:在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换.原因如下:网络协议规定接收到得第一个字节是高字节, ...

  5. 网络通信之 字节序转换原理与网络字节序、大端和小端模式

    一.在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节, ...

  6. 套接字中的数据转换(大端模式/小端模式)

    通常使用的有两种数据类型:短型(两个字节)和长型(四个字节). 下面介绍的这些转换函数对于这两类的无符号整型变量都可以正确的转换. 如果你想将一个短型数据从主机字节顺序转换到网络字节顺序的话,有这样一 ...

  7. 判断单片机MCU是大端还是小端模式

    最近用杰理AC6966B调试博通的BK9527 U段发射芯片,一直没调通,经过测试IIC通讯是通,硬件还是好的,但是怎么都调不到与接收端成功连接. 最后咨询原厂得知提供的demo代码是大端编码模式的M ...

  8. 嵌入式大端、小端模式存储

    中文名(大小端模式)                                               外文名(Big-endian/Little-endian) 大端模式,是指数据的高字节 ...

  9. 大端模式 小端模式学习笔记

    2019独角兽企业重金招聘Python工程师标准>>> Big-Endian和Little-Endian的定义如下: 1) Little-Endian就是低位字节排放在内存的低地址端 ...

最新文章

  1. 深入理解JavaScript定时函数setTimeout
  2. IIS中架设二级域名网站
  3. java 并发 变量_实例讲解Java并发编程之变量
  4. Python递归通用接口响应深层提取
  5. Shell-杀死指定进程
  6. 使用反射创建实例/对象的两种方法
  7. Android下 使用百度地图sdk
  8. linux看注册的定时任务,Linux下定时任务的查看及取消
  9. 使用pn532将全加密卡复制到手环上 NFC校园门禁卡模拟教程
  10. 射频识别技术——数据编码
  11. 什么是小规模纳税人、小型微利企业、小微企业
  12. 支付宝小程序登录PHP
  13. kali渗透姿式小汇总
  14. Python 常用写法
  15. 2008年9月3号,星期三,晴。日日行,不怕千万里;常常做,不怕千万事。 ——《格言联璧•处事》
  16. 电脑通过wifi连接手机(adb移动设备连接电脑)
  17. 生信分析之R语言常用R包一步下载
  18. Pytorch 中的detach 和detach_
  19. Windows XP注册表与驱动程序优化全集
  20. OpenStack创建,分发并初始化rings

热门文章

  1. 超声射频信号的产生(RF Signal)
  2. python数据库模糊查询_原创:Python编写通讯录,支持模糊查询,利用数据库存储...
  3. docker编译Linux内核,c – 如何编译在docker中使用内核函数的C代...
  4. MutationObserver详解
  5. C语言学习之分别用while、for 编写程序,计算2*4*6*......*100的值
  6. #012python实验课
  7. 领扣(LeetCode)寻找旋转排序数组中的最小值 个人题解
  8. livecd制作 centos
  9. Android 查看设备文件
  10. $()是有两个参数,第一个是选择器,第二个是作用域