从计算机端序说起

一. 故事背景

1.最近在学习网络知识,自然免不了端序问题的探索;
2.在数据组织的过程中,遇到了端序问题的困扰;
3.具体问题是在,最开始我只是想单纯测试我计算机当前的端序。

二.故事开始

对于端序测试,其实就是看数据在内存中的存储方式,这句话比较笼统,大概是这个意思:

大端模式:数据的高位存储在内存的低字节。ARM/PowerPC等处理器采用大端模式
小端模式:数据的低位存储在内存的低字节。Intel架构处理器采用小端模式。

以下是我当时做的一些笔记:
在这里插入图片描述

是的,网络采用的是大端字节序

而不必担心,主机字节序与网络字节序的相互转换,系统是有提供相应函数的:
h代表host;n代表net

#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);

而为什么会有端序的区分呢?

首先,大小端序是由CPU决定的(网络字节序是固定的哦)
其次,谁好谁坏是没有确切定论的,这是最早设计者们的选择,一篇知乎的文章挺有意思,大概解释了端序问题:https://www.zhihu.com/question/275738523/answer/382407340

三.故事继续

搞清楚概念,开始实践了----测测我的window下的端序,Linux下的端序。
是的,这是个很简单的基础,一个联合数据类型,或者一个int转char就可以搞定了。
(惭愧地报告一番,我竟然在联合数据类型上栽了个跟头,唉…)

那我们来浅谈一番Union

在这里插入图片描述

而我栽就栽在我忘了union的成员都是相对于其union的内存分配的基地址(首地址)开始计算的,所以我一开始测,总发现和结论是反的(再次手动捂脸)。

所以,最终上一个简单的端序测试代码

#include <stdio.h>

int main()
{
    union
    {
        int nNum;
        char cNum;
    }unionChk;

    unionChk.nNum = 1;

    if(unionChk.cNum == 1)
    {
        printf("Little Endian\n");
    }
    else if(unionChk.cNum == 0)
    {
        printf("Big Endian\n");
    }
    
    printf("========== Check it Again ========== \n");

    int nBuf = 0x11223344;
    if((char)nBuf == 0x11)
    {
        printf("Big Endian\n");
    }
    else if((char)nBuf == 0x44)
    {
        printf("Little Endian\n");
    }
}

四.故事结束

好啦,端序概念是很基础的知识,总结至此,还有很多基础知识需要夯实,持续进步,保持学习技术的初心。

推荐一本经典书籍:
《UNIX编程艺术》,读得懂,但并不代表能理解,真所谓此中有深意…

不足望指正,互相交流,共同进步

猜你喜欢

转载自blog.csdn.net/Being__/article/details/82795858