字节序就是字节在内存中的存储顺序,如果是单字节,这个顺序就无所谓,但是对于多字节,这个顺序就很重要了。根据这个顺序字节序分为大端序(big-endian)
和小端序(little-endian)
,还有一种不太常见的混合序(middle-endian)
。
大端序 & 小端序 & 混合序
大端序(big-endian):数据的高位字节存放在地址的低端 低位字节存放在地址高端
小端序(little-endian):数据的高位字节存放在地址的高端 低位字节存放在地址低端
混合序(middle-endian):数据的存放一部分按大端序规则,一部分按小端序规则
下面以int
类型4
字节数字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集序找到他其他的兄弟。
网友评论