字节序
计算机最小的存储单位是 位(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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)