网络字节序和主机字节序详解!!!

我们都知道,如今的通讯方式已经趋向与多样化,异构通信(计算机软件(操作系统) +    计算机硬件(内核架构,ARM,x86)不同)也已经很普遍了,如,手机和电脑中的qq进行通信,,,


同时,在计算机设计之初,对内存中数据的处理也有不同的方式,(低位数据存储在低位地址处或者高位数据存储在低位地址处),然而,在通信的过程中(ISO/OSI模型和TCP/IP四层模型中),数据被一步步封装(然后加入信息首部),当传到目的段时,被一步步解封,然后获取数据


从上面我们可以看出,数据在传输的过程中,一定有一个标准化的过程,也就是说:从主机a到主机b进行通信,

a的固有数据存储-------标准化--------转化成b的固有格式


如上而言:a或者b的固有数据存储格式就是自己的主机字节序,上面的标准化就是网络字节序(也就是大端字节序)


a的主机字节序----------网络字节序 ---------b的主机字节序



主机字节序:

就是自己的主机内部,内存中数据的处理方式,可以分为两种:

大端字节序(big-endian):按照内存的增长方向,高位数据存储于低位内存中

小端字节序(little-endian):按照内存的增长方向,高位数据存储于低位内存中

网络字节序和主机字节序详解!!!_第1张图片

但是,如何知道我们的主机是那一种的呢???这个我们可以通过程序来进行验证:


#include <stdio.h>
#include <arpa/inet.h>

int main(){

                unsigned long a = 0x12345678;
                unsigned char *p = (unsigned char *)(&a);

                printf("主机字节序:%0x    %0x   %0x   %0x\n",  p[0], p[1], p[2], p[3]);

                unsigned long b = htonl(a);  //将主机字节序转化成了网络字节序
                
                p = (unsigned char *)(&b);

                printf("网络字节序:%0x    %0x   %0x   %0x\n",  p[0], p[1], p[2], p[3]);
                return 0;
        }  
运行结果:

网络字节序和主机字节序详解!!!_第2张图片

可以看到我的当前主机是:小端字节序


关于:htonl

#include <arpa/inet.h>

       uint32_t htonl(uint32_t hostlong);

       uint16_t htons(uint16_t hostshort);

       uint32_t ntohl(uint32_t netlong);

       uint16_t ntohs(uint16_t netshort);

h是主机host,n是网络net,l是长整形long,s是短整形short,所以上面这些函数还是很好理解的

你可能感兴趣的:(网络字节序和主机字节序详解!!!)