字节序
计算机最小的存储单位是 位(Bit),但是,计算机中最基本的存储单位是字节(Byte)。
1 Byte = 8 Bit
计算机在存储大于1字节的数据时,会将这个数据拆分为多个字节,再将它们按顺序存储起来,存储和读取这些字节的顺序,就是字节序。
定义
字节序(Endianness),即计算机在存储或读取数据时,字节的顺序。
分类
字节序分为 大端序(Big endian)
和 小端序(Little endian)
。
- 大端序:高位字节在前,低位字节在后。
- 小端序:低位字节在前,高位字节在后。
人读写数字的顺序就是
大端序
,人在读(写)数字时,总是先读(写)高位,再读(写)低位。例如:对于数字
520
- 在写数字的时候,先写5,再写2,最后写0
- 在读数字的时候,先读5,再读2,最后读0
而在计算机的存储中,一般都是
小端序
存储。
同时,还有主机序和网络序的概念:
主机序
是小端序
。网络序
是大端序
。
实战(基于C语言)
-
判断计算机是大端序还是小端序
#include <stdio.h> union { short a; char b[2]; } un; int main() { un.a = 0x1234; if(un.b[0] == 0x34) { printf("小端序"); } else if(un.b[0] == 0x12) { printf("大端序"); } return 0; }
说明
C语言中,
short
是16位整数,所以会被拆成两个字节存储,我们将一个short类型的整数赋值为0x1234
,如果它先存储0x34
(即它的低位字节),就是小端序;反之,如果它先存储0x12
(即它的高位字节),就是大端序。 -
利用指针转换字节数组和基本类型
-
字节数组转short(单个数字)
#include <stdio.h> int main() { char chs[2] = {0x34, 0x12}; // 小端序数据0x1234 short a = *((short*)chs); printf("0x%X", a); // 输出0x1234 return 0; }
-
字节数组转short(多个数字)
#include <stdio.h> int main() { char chs[4] = {0x34, 0x12, 0x78, 0x56}; // 小端序数据0x1234, 0x5678 short a = *((short*)chs); short b = *((short*)(chs+2)); printf("0x%X \n", a); // 输出0x1234 printf("0x%X \n", b); // 输出0x5678 return 0; }
-
short转字节数组
#include <stdio.h> int main() { char chs[2]; short a = 0x1234; for(int i = 0; i < 2; i++) { chs[i] = ((char*)&a)[i]; } // 小端序计算机将输出: chs[0]=0x34, chs[1]=0x12 printf("chs[0]=0x%X \n", chs[0]); printf("chs[1]=0x%X \n", chs[1]); return 0; }
-
利用联合体转换字节数组和基本类型
#include <stdio.h> union { short a; char chs[2]; } un; int main() { //将short转换为字节数组// un.a = 0x1234; // 小端序计算机将输出: chs[0]=0x34, chs[1]=0x12 printf("chs[0]=0x%X \n", un.chs[0]); printf("chs[1]=0x%X \n", un.chs[1]); //将字节数组转换为short// un.chs[0] = 0x78; un.chs[1] = 0x56; printf("a=0x%X \n", un.a); // 输出0x5678 return 0; }