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

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

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

从上面我们可以看出,数据在传输的过程中,一定有一个标准化的过程,也就是

说:从主机a到主机b进行通信,

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

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

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

主机字节序:

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

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

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

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

#include <stdio.h>
//#include <arpa/inet.h>  //linux
#include<WinSock2.h>      //windows

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;
}

运行的结果如图:

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

关于:htonl

    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,所以上面这些函数还是很好理解的。(所以64位的字节序转换需要自己另外实现)

对于大小端记忆困难的,可以参考[轻松记住大端小端的含义(附对大端和小端的解释)](https://www.cnblogs.com/wuyuegb2312/archive/2013/06/08/3126510.html

使用高尾端取代大端,低尾端取代小端。方便记忆= =

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
    union 
    {
        short s;
        char c[sizeof(short)];
    } un;
    un.s = 0x0102;
    if(sizeof(short)==2) 
    {
        if(un.c[0]==1 && un.c[1] == 2)
        {
            printf("big-endian\n");
        }
        else if (un.c[0] == 2 && un.c[1] == 1)
        {
            printf("little-endian\n");
        }
        else
        {
            printf("unknown\n");
        }
    } 
    else
    {
        printf("sizeof(short)= %d\n",sizeof(short));
    }
    exit(0);
}

参考
网络字节序和主机字节序详解!!!
htons函数具体解释
htons函数具体解释
轻松记住大端小端的含义(附对大端和小端的解释)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值