iOS 字节序
2020-09-14 本文已影响0人
Sweet丶
计算机存储数据时,数据是由地址连续的多个字节来完成存储的,如:int是4个字节,数据int i_num = 0x12345678; 由4个字节连续的地址空间来存储,每个字节存2位。
存储数据有大端、小端两种模式:
比如int i_num的地址假设:0x100,0x101,0x102,0x103。
大端模式:由低地址开始存放的高位的字节数据. 即0x100中存放的是0x12, 0x101中存放0x34,0x102中存放0x56, 0x103中存放0x78.
小端模式:由低地址开始存放的低位字节的数据。即0x100中存放的是0x78, 0x101中存放0x56,0x102中存放0x34, 0x103中存放0x12.
iOS系统是小端模式的,网络字节序是大端模式的,测试代码如下:
/**
* 大端:高位字节在低地址,低位字节在低地址。
* 小端:低位字节在低地址,高位字节在高地址。更符合计算机
*/
void testByteOrder(){
printf("系统字节序:\n");
int i_num = 0x12345678; // 运行结果是小端模式
printf("[0]:0x%x\n", *((char *)&i_num + 0));
printf("[1]:0x%x\n", *((char *)&i_num + 1));
printf("[2]:0x%x\n", *((char *)&i_num + 2));
printf("[3]:0x%x\n", *((char *)&i_num + 3));
printf("\n网络字节序:\n");// 运行结果是大端模式
i_num = htonl(i_num); // htonl 将i_num转换成网络字节序
printf("[0]:0x%x\n", *((char *)&i_num + 0));
printf("[1]:0x%x\n", *((char *)&i_num + 1));
printf("[2]:0x%x\n", *((char *)&i_num + 2));
printf("[3]:0x%x\n", *((char *)&i_num + 3));
}
运行结果:
系统字节序:
[0]:0x78
[1]:0x56
[2]:0x34
[3]:0x12
网络字节序:
[0]:0x12
[1]:0x34
[2]:0x56
[3]:0x78