一.大端小端含义和判断
大端模式:按照高字节存低地址,低字节存高地址,先访问高地址。
小端字节序: 按照低字节存低地址,高字节存高地址,先访问低地址。
1.如何判断平台是小端还是大端?
分析:一个char字符一个字节,一个short 两个字节;
char s[2] = {0, 1};unsigned short *ret = (unsigned short *)(s);printf("ret:%d\n", *ret);
因为我们已经给出s[2],并且已经确定了这两个字节在内存中的存储顺序就是:
相对的地址: (低地址) 0x00 0x01 0x02 0x03 高地址
字节序 【0000 0000】【0000 0001】
小端模式下,内存中从低位开始读,转换为二进制就是:
0000 0001 0000 0000
表示为十进制就是256
大端模式下,内存中从高地址开始读,转换为二进制就是:
0000 0000 0000 0001
表示十进制就是1
读出来的数据转换为二进制时,低位放在右边,高位放在左边,初学者很容易混淆比如我。
二.位运算
这里假设有unsigned int 值 num,转换为二进制为:
num 二进制:0100 0001 1000 0010 0011 1000 1000 0101
操作 :num>>16
num 转换后:0000 0000 0000 0000 0100 0001 1000 0010
操作: num<<16
num转换后: 0011 1000 1000 0101 0000 0000 0000 0000
按位与 &
- 当两个对应的位都为
1
时,结果为1
;否则结果为0
。
按位或 |
- 当至少有一个相应位为
1
时,结果为1
;当两个位都为0
时,结果为0
。
举例:
unsigned int tmp;fread(&tmp, 1, 3, fp);*u24 = (((tmp >> 16) & 0xFF) | ((tmp << 16) & 0xFF0000) | (tmp & 0xFF00));
从文件中读取的3个字节,tmp中多余的高位字节被0填充;
(tmp >>16) 留下了高 8 位
(tmp <<16)留下了低 8 位变成了高 8 位
为什么要& 0xFF 0xFF0000 0xFF00 ,这是为了确保,当tmp不符合预期或者数据源中的内容无效的时候,确保操作的结果符合我们期望的格式。
这个操作是将高8位和低8位互换,一般用于3个字节的小端字节序转换到大端字节序。