大端序小端序
大端序 小端序
不同机器厂商实现不同,导致字节序列在内存中呈现的形式也不同。内存中是以字节为单位存储,地址空间为 0 - 2^n-1。那么问题来了,对于一个多字节序列的变量值,在内存中的存储顺序是什么样的呢?比如int 4字节。
通常我们表示一个二进制或16进制时,是高有效位写左边,和写十进制数字类似,比如12345(1是万单位,为高有效位)。
12345在16进制表示为:3039。二进制表示为:110000 00111001
大端序是指,高有效位在内存低位。小端序反之。
地址 0x100 | 地址 0x100 | 0x101 | 0x102 |
---|---|---|---|
大端序 | 16进制值 | 30 | 39 |
大端序 | 2进制值 | 00110000 | 00111001 |
小端序 | 16进制值 | 39 | 30 |
小端序 | 2进制值 | 00111001 | 00110000 |
假设 整数 12345 在内存展现如上,30 作为高有效字节,在101的内存低位,说明是大端序的机器。
有一点再强调,大小端序是说的内存存储序列,以字节为单位。单字节内顺序不变。
利用一段代码,校验当前机器是大or小端序:
# include <stdio.h>
typedef char * pointer_byte;
void showbyte(pointer_byte b, int len);
int main(){
int x = 12345;
showbyte((pointer_byte) &x, sizeof(int));
return 0;
}
void showbyte(pointer_byte b, int len){
for (int j = 0; j < len; ++j) {
printf("%.2x", b[j]);// 字节序列 打印每个字节
}
printf("\n");
}
// 39300000
// 12345,39作为低有效位,存在内存低位,说明是小端序
不同的机器之间,利用网络消息传递,这就要求必须统一一个处理顺序。 网络字节序,报文传输规定了大端序。如果小端序的机器发送数据报前,要转换成大端序。有几个函数提供转换:
函数 | 含义 |
---|---|
htonl() | Host to Network Long |
ntohl() | Network to Host Long |
htons() | Host to Network Short |
ntohs() | Network to Host Short |