字节序
计算机最小的存储单位是 位(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};
short a = *((short*)chs);
printf("0x%X", a);
return 0;
}
-
字节数组转short(多个数字) #include <stdio.h>
int main()
{
char chs[4] = {0x34, 0x12, 0x78, 0x56};
short a = *((short*)chs);
short b = *((short*)(chs+2));
printf("0x%X \n", a);
printf("0x%X \n", b);
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];
}
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()
{
un.a = 0x1234;
printf("chs[0]=0x%X \n", un.chs[0]);
printf("chs[1]=0x%X \n", un.chs[1]);
un.chs[0] = 0x78;
un.chs[1] = 0x56;
printf("a=0x%X \n", un.a);
return 0;
}
|