精华内容
下载资源
问答
  • 大小端及网络字节

    万次阅读 多人点赞 2018-01-22 23:58:21
     “大端”和”端”表示多字节值的哪一端存储该值的起始地址处;端存储起始地址处,即是字节序;大端存储起始地址处,即是大端字节序;具体的说:  ①大端字节序(Big Endian):最高有效位存于最低内存...

    什么是大端模式、小端模式

      “大端”和”小端”表示多字节值的哪一端存储在该值的起始地址处;小端存储在起始地址处,即是小端字节序;大端存储在起始地址处,即是大端字节序;具体的说:
       ①大端字节序(Big Endian):最高有效位存于最低内存地址处,最低有效位存于最高内存处;
       ②小端字节序(Little Endian):最高有效位存于最高内存地址,最低有效位存于最低内存处。
       如下图:当以不同的存储方式,存储数据为0x12345678时:
      这里写图片描述

    判断字节序

      可以通过下面的小程序测试自己的机器是大端字节序还是小端字节序

    #include <stdio.h>
    union
    {
        char ch;
        int i;
    }un;
    int main(void)
    {
        un.i = 0x12345678;
        if(un.ch == 0x12)
        {
            printf("big endian\n");
        }
        else
        {
            printf("small endain\n");
        }
        return 0;
    

      在测试程序中,使用联合体的原因是:union型数据所占的空间等于其最大的成员所占的空间。对union型成员的存取都是相对于该联合体基地址的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从union的首地址开始的。通过检测第一个字节存放的数据即可得出结果。

    网络字节序

      网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题;
      UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的;
      所以说,网络字节序是大端字节序;
      在实际中,当在两个存储方式不同的主机上传输时,需要借助字节序转换函数。

    字节序转换函数

     #include <arpa/inet.h>
    
    //将主机字节序转换为网络字节序
     unit32_t htonl (unit32_t hostlong);
     unit16_t htons (unit16_t hostshort);
     //将网络字节序转换为主机字节序
     unit32_t ntohl (unit32_t netlong);
     unit16_t ntohs (unit16_t netshort);
    
     说明:h -----host;n----network ;s------short;l----long。
    

    例如:

    #include <stdio.h>
    #include <arpa/inet.h>
    
    int main()
    {
        unsigned int x = 0x12345678;
        unsigned char *p = (unsigned char *)&x;
        printf("%0x_%0x_%0x_%0x\n",p[0],p[1],p[2],p[3]);
    
        unsigned int y = htonl(x);
        p = (unsigned char*)&y;
        printf("%0x_%0x_%0x_%0x\n",p[0],p[1],p[2],p[3]);
    
        return 0;
    }
    

    运行结果:
    这里写图片描述

    展开全文
  • 网络字节序和大小端字节序

    千次阅读 2014-02-15 10:17:25
    先说说为什么会有大小端字节序的问题。现在PC机的一个整型变量一般是32位的,由4个字节组成。计算机内存中,每个字节都...这时就存在一个问题,对于低8位11001011是存放整型的那4个字节的低地址位还是高地址位。如

            先说说为什么会有大小端字节序的问题。现在PC机的一个整型变量一般是32位的,由4个字节组成。在计算机内存中,每个字节都是有地址的。也就是说一个整型的4个字节的地址是不同的,有高低地址之分。对于一个整数,如632523,其对应的二进制位1001 10100110 11001011。需要3个字节才能放得下。这时就存在一个问题,对于低8位11001011是存放在整型的那4个字节的低地址位还是高地址位。

            如果将低8位存放在4个字节中的低地址位,称为小端字节序,如果将低8位存放在高地址位,则为大端字节序。助记:沿着内存的增长方向,先存低8位是的小端;先存高8位的是大端。大小端字节序是由CPU决定的[1][2][3]

            虽然不同的CPU厂商可以随意选择一种字节序作为自己的内存字节序,但是网络字节序就不能任由各个CPU选择,网络字节序被规定为大端字节序

            一般来说,主机要先把端口号从主机字节序转换到网络字节序。有下面的函数可以相互转换。

    #include<netinet/in.h>
    unsigned long int htonl(unsigned long int hostlong);
    unsigned short int htons(unsigned short int hostshort);
    unsigned long int ntohl(unsigned long int netlong);
    unsigned short int ntohs(unsigned short int netshort);

            其中,htonl 表示”host to network long”。

            有了这些转换函数,用户就不需要知道所在的OS/CPU用的什么字节序。反正这些函数会被我们想要的值转换成网络字节序的值。


            除了这4个函数外,在头文件endian.h中,还定义了很多主机字节序和大小端字节序相互转换的函数。

            从这里可以看到,下面函数是在glibc 2.9及之后的版本才支持。可以用$ldd --version命令 查看glibc的版本。 

           

           其中,be是表示大端,le是表示小端。


           上图中的那些函数(其实那些是宏定义),用来配置端口号是没有用的,因为已经有htons函数了。但在解决TCP粘包问题中,这些函数就可以派上用场了。

            解决TCP粘包问题的一个方法是,在每条消息的头部添加一个长度字段。每一个主机在发送消息前,都把长度转换成大端字节序存放(转换成小端字节序也行,只要CS两端统一即可)。然后发送消息。对端在收到消息的长度字段后,就将其从大端字节序转换成主机字节序。

           这里存在一个问题,怎么将怎么将收到的字节流转换成大端字节序的整型变量。答案是用memcpy函数。在发送端将整型变量变成字节流也是用这个函数。

     

           如下面代码所示:

        //发送端
        int len = htobe32(a);
        char ch[10];
        memcpy(ch, &len, sizeof(len) );
    
        
        //接收端
        int len;
        char* message;
        memcpy(&len, message, sizeof(len) );
        a = be32toh(len);


    参考:

    [1]  http://en.wikipedia.org/wiki/Endianness

    [2] http://stackoverflow.com/questions/9237317/what-makes-a-system-little-endian-or-big-endian

    [3] http://superuser.com/questions/308274/what-determines-endianness



    展开全文
  • 端:低地址存放低字节,高地址存放高字节;  大端:高地址存放低字节,低地址存放高字节; 网络字节序是:大端。


    小端:低地址存放低字节,高地址存放高字节; 

    大端:高地址存放低字节,低地址存放高字节;

    网络字节序是:大端。


    展开全文
  • linux的大小端、网络字节序问题 .

    千次阅读 2013-08-04 19:35:24
    1、80X86使用端法,网络字节序使用大端法。 2、二进制的网络编程中,传送数据,最好以unsigned char, unsigned short, unsigned int来处理, unsigned short ,unsigned short 以网络字节序处理后再拷贝到发送...

    1、80X86使用小端法,网络字节序使用大端法。

    2、二进制的网络编程中,传送数据,最好以unsigned char, unsigned short, unsigned int来处理, unsigned short ,unsigned short 以网络字节序处理后再拷贝到发送的buffer里

    3、结构体前后要指定 #pragma  pack(1)

     一.字节序

    对于字节序(大端法、小端法)的定义《UNXI网络编程》定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。小端存在起始地址,即是小端字节序;大端存在起始地址,即是大端字节序。也可以说:

    1.小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端。

    2.大端法(Big-Endian)就是高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端。

    举个简单的例子,对于整形0x12345678。它在大端法和小端法的系统内中,分别如图1所示的方式存放。

     

    X86字节序

     

    二.网络字节序

    我们知道网络上的数据流是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它是将这个字节作为高位还是低位来处理呢?

    网络字节序定义:收到的第一个字节被当作高位看待,这就要求发送端发送的第一个字节应当是高位。而在发送端发送数据时,发送的第一个字节是该数字在内存中起始地址对应的字节。可见多字节数值在发送前,在内存中数值应该以大端法存放。

    网络字节序说是大端字节序。

    比如我们经过网络发送0x12345678这个整形,在80X86平台中,它是以小端法存放的,在发送前需要使用系统提供的htonl将其转换成大端法存放,如图2所示。

    网络字节序

     

     

    三.字节序测试程序

    不同cpu平台上字节序通常也不一样,下面写个简单的C程序,它可以测试不同平台上的字节序。

    #include <stdio.h>
    #include <netinet/in.h>
    
    int main()
    {
        int i_num = 0x12345678;
        printf("[0]:0x%x\n", *((char *)&i_num + 0));
        printf("[1]:0x%x\n", *((char *)&i_num + 1));
        printf("[2]:0x%x\n", *((char *)&i_num + 2));
        printf("[3]:0x%x\n", *((char *)&i_num + 3));
     
        i_num = htonl(i_num);
        printf("[0]:0x%x\n", *((char *)&i_num + 0));
        printf("[1]:0x%x\n", *((char *)&i_num + 1));
        printf("[2]:0x%x\n", *((char *)&i_num + 2));
        printf("[3]:0x%x\n", *((char *)&i_num + 3));
     
        return 0;
    } 
     

    在80X86CPU平台上,执行该程序得到如下结果:

    [0]:0x78

    [1]:0x56

    [2]:0x34

    [3]:0x12

    [0]:0x12

    [1]:0x34

    [2]:0x56

    [3]:0x78

    分析结果,在80X86平台上,系统将多字节中的低位存储在变量起始地址,使用小端法。htonl将i_num转换成网络字节序,可见网络字节序是大端法。

     转自:http://www.ej38.com/showinfo/linux-156945.html

    展开全文
  • 如何判断机器的字节顺序是高字节在前还是字节在前 2015年08月12日 21:41:58 阅读数:4544 最近经常听各种人群里面讨论各种机,linux,mac,windows,单片机的啥都有。讨论的焦点就是这些机器上到底是高字节...
  • 大小端模式与网络字节

    千次阅读 2015-06-03 11:18:16
    有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。 二、大小端模式的不同带来的问题是什么?如何解决? 如果存在数据网络传输,如果大小端模式不一致,如果不经过转换,必然会导致数据不致,出现错误...
  • 大端和端(网络字节序和主机字节序): 大端(Big Endian):即网络字节序。 端(Littile Endian):即主机字节序。 记忆方式:网络的范围很,所以大端是网络字节序。 大端方式将高位存放低地址,端...
  • 1.Union成员本身是被存放相同的内存空间中(即共享内存),union联合体占用内存大小等于该union的最大成员的大小,所以一个有char型和int型变量的union中可以通过取值判断出主机字节序; 2.将一个char(BYTE)型变量...
  • 字节网络序大小端问题

    万次阅读 2017-10-16 16:07:36
    字节序(little-endian):按照内存的增长方向,高位数据存储于高位内存中 网络序是大端的 深层次讨论 说起来很抽象,看图: 0X12345678这个数哪里是高位哪里是低位呢?显然12是高位,78是低位...
  • 不同的CPU有不同的字节序类型 这些字节序是指整数内存中保存的顺序 这个叫做主机字节序,存储方式有2种 1)、大端模式 大端模式(Big-Endian)就是高位字节排放内存的低地址端(即该值的起始地址),低位字节排放...
  • 大小端、网络字节序问题

    万次阅读 2010-01-08 18:15:00
    总结:1、80X86使用端法,网络字节序使用大端法。 2、二进制的网络编程中,传送数据,最好以unsigned char, unsigned short, unsigned int 来处理, unsigned short ,unsigned short 以网络字节序处理后再拷贝...
  • 网络字节序 大端

    千次阅读 2014-10-17 15:55:19
    1.端法(Little-Endian)就是低位字节排放内存的低地址端(即该值的起始地址),高位字节排放内存的高地址端; 2.大端法(Big-Endian)就是高位字节排放内存的低地址端(即该值的起始地址),低位字节排放内存的高...
  • 总结:1、80X86使用端法(即本地字节序),网络字节序使用大端法。  2、二进制的网络编程中,传送数据,最好以unsigned char, unsigned short, unsigned int  来处理, unsigned short ,unsigned short ...
  • 大端、端与网络字节

    万次阅读 2016-08-05 08:57:37
    大端(Big-Endian),端(Little-Endian)以及网络字节序的概念编程中经常会遇到,其中网络字节序(Network Byte Order)一般是指大端(Big-Endian,对部分网络传输协议而言)传输,大端端的概念是面向多字节...
  • 引言:进行网络通信时是否需要进行字节序转换?  相同字节序的平台进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。 原因如下:网络协议规定接收到得第一个字节是高...
  • 大端模式端模式以及网络字节

    千次阅读 2017-12-05 15:20:57
    主机字节序有两种:大端模式和端模式 大端模式:高字节存放低地址,低字节存放高地址; 端模式:低字节存放低地址,高字节存放高地址; ...网络字节序类似于大端模式,注意是类似,
  • (原来在字节的票友还真不少) 从一些票友的表述上来看,取消大小周,意味着一年接近 10 万元的收入木了,不得不说,字节的加班费是真的多! 但与此同时,为字节拼搏奋斗的票友们终于享受到了双休的快乐!周六出去...
  • 字节顺序是指占内存多于一个字节类型的数据内存中的存放顺序,通常有两种字节顺序,根据他们所处的位置我们分别称为主机节序和网络字节序。 通常我们认为网络字节序为标准顺序,封包的时候,将主机字节序转换为...
  • 2. 什么是网络字节序?3. 什么是主机字节序?3.1 主机字节序3.2 大小端字节序4. 举例 1. 什么是字节序? 字节序: 顾名思义字节的顺序,就是大于一个字节类型的数据内存中的存放顺序。 一个字节的数据没有顺序的...
  • 大小端模式 & 字节

    千次阅读 2016-12-14 20:17:25
    端模式的说法,来自乔纳森·斯威夫特的小说《格列夫游记》,小人国内部分裂成 Big-endian 和 Little-endian 两派,他们的争论在于一派要求从鸡蛋的大头把鸡蛋打破,另一派要求从鸡蛋的小头把鸡蛋打破。...
  • 1. 是否知道字节序,网络字节序与主机字节序的差异(大小端字节序)(1) 大端与端是用来描述多字节数据内存中的存放顺序,即字节序(2) 不同CPU有不同的字节序类型这些字节序是指整数内存中保存的顺序这...
  • 大头小头 字节

    千次阅读 2018-06-01 20:03:57
    主要在于哪里是低地址,哪里是低字节 字节序有两种: ...这种字节序又称为网络字节序,socket传输时就需要使用这种字节序。   假设我们的32位整数0x12345678是从起始位置为0x00的地址开始存放,则:...
  • 字节序(大小端)理解

    万次阅读 2019-05-22 14:26:02
    一、概念 字节序,就是 大于一个字节类型的数据内存中的存放顺序。...2.Little-Endian(端):低位字节排放内存的低地址端,高位字节排放内存的高地址端。 三、高低地址与高低字节 高低地址: C程...
  • 大小字节

    万次阅读 2011-11-19 17:18:23
    大端字节(big-endian)和字节(little-endian)  今天碰一个关于字节顺序的问题,虽然看起来很简单,但一直都没怎么完全明白这个东西,索性就找了下资料,把它弄清楚.  因为现行的计算机都是以八位一个字节为存储...
  • 大端端 && 网络字节

    万次阅读 2014-10-08 11:02:13
    (1)网络字节序定义: 收到的第一个字节被当作高位看待,这就要求发送端发送的第一个字节应当是高位。 (2)网络字节序为大端序列: 发送端发送数据时,发送的第一个字节是该数字内存中起始地址对应
  • 网络字节

    千次阅读 2011-09-19 15:41:05
    网络字节序一.字节序 字节序是由于不同的主处理器和操作系统,对大于一个字节的变量内存中的存放顺序不同而产生的。 字节序通常有大端字节序列和端字节序两种分类方法。 由于主机的千差万别,主机的字节序不...
  • 网络字节序跟主机字节序有什么区别,这是我16年9月份校招面试腾讯被问到的一个问题,也是Linux服务器开发岗常考的面试题。 字节序分为大端字节序和端字节序 大端字节序是指一个整数的高位字节(32-31bit)...
  • 一、进行网络通信时是否需要进行字节序转换? 相同字节序的平台进行...端模式的多字节数据存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低...
  • 网络字节序故事的起源“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了...
  • 1.网络字节序与主机字节序Linux网络编程中,经常碰到网络字节序与主机字节序的相互转换。说到网络字节序与主机字节序需要清晰了解以下几个概念。字节序,顾名思义,指字节内存中存储的顺序。比如一个int32_t类型...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 652,266
精华内容 260,906
关键字:

网络字节是大在前还是小