字节序

作者: TIME_for | 来源:发表于2017-05-20 09:49 被阅读85次

    字节序就是字节在内存中的存储顺序,如果是单字节,这个顺序就无所谓,但是对于多字节,这个顺序就很重要了。根据这个顺序字节序分为大端序(big-endian)小端序(little-endian),还有一种不太常见的混合序(middle-endian)

    大端序 & 小端序 & 混合序

    大端序(big-endian):数据的高位字节存放在地址的低端 低位字节存放在地址高端
    小端序(little-endian):数据的高位字节存放在地址的高端 低位字节存放在地址低端
    混合序(middle-endian):数据的存放一部分按大端序规则,一部分按小端序规则

    下面以int类型4字节数字0x12345678为例说明:

    数字 0x12345678 按不同的字节序在内存中的存储方式

    那么为什么会出现不同的字节序呢?计算机对数字进行处理的时候,都是先从低位开始处理的,所以小端序就非常适合计算机进行数据处理,这样能提高计算机处理数据的效率。但是人类在读写数字的时候,还是习惯从高位开始,这样就大端序就适合人类读写。

    网络字节序 & 主机字节序

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

    判断机器的字节序

    思路就是用一个高于1字节的数据,然后想办法读取它的最低的那个字节。这里给个示例:

    void cpu_endianness() {
        
        int a = 0x12345678;
        int first_bit = *((char*)&a);
        
        if (first_bit == 0x12) {
            printf("big endian.\n");
        } else if (first_bit == 0x78) {
            printf("little endian.\n");
        } else {
            printf("others endian.\n");
        }
        
    }
    

    更新2017.06.18
    这是一系列文章的其中一篇,你可以在这儿Encode & Decode集序找到他其他的兄弟。

    参考

    相关文章

      网友评论

        本文标题:字节序

        本文链接:https://www.haomeiwen.com/subject/gxpwzttx.html