美文网首页
iOS 字节序

iOS 字节序

作者: Sweet丶 | 来源:发表于2020-09-14 13:47 被阅读0次

    计算机存储数据时,数据是由地址连续的多个字节来完成存储的,如: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
    

    相关文章

      网友评论

          本文标题:iOS 字节序

          本文链接:https://www.haomeiwen.com/subject/fdxzektx.html