自学内容网 自学内容网

linux 网络序

大小端判断
  • 根据整形二进制显示判断

    • 高位字节存放在内存中高地址处,低位字节存放在内存中低地址处则是小端;
    • 高位字节存放在内存中低地址处,低位字节存放在内存中高地址处则是大端;
    typedef struct Test{
    int a;
    int b;
    }Test_t;
    
    Test_t t = {.a=5,.b=6};
    // t.a二进制显示: 00000000 00000000 00000000 00000101
    // t.b二进制显示: 00000000 00000000 00000000 00000110
    // 查看t.a或t.b在内存中的二进制布局
    
    gcc -g test.c - test
    gdb ./test
    x/4tb &t.a
    0x7fffffffeb38: 00000101        00000000        00000000        00000000
    # 低字节00000101在内存中存放在低位地址(内存显示左到右是地址递增的),所以是小端
    # t.b同理
    x/4tb &t.b
    0x7fffffffeb3c: 00000110        00000000        00000000        00000000
    
    
    // 衍生出将多字节整形转单字节来判断大小端
    short int a = 3; // 00000000 00000011
    char c = (char)a;
    printf("%d\n", c); // 若c是0,则是大端,是3则小端
    
  • 在将ip字符串转网络序存储时

    char ipv4[] = "192.168.0.2";
    long nip = 0;
    inet_pton(AF_INET, ipv4, &nip);
    
    long uip = ntohl(nip);
    printf("%ld, %ld\n", uip, nip); // 若两者一样,则是大端(网络序是大端)
    x/4tb &nip
    0x7fffffffde08: 11000000        10101000        00000000        00000010
    
    x/4tb &uip
    0x7fffffffde30: 00000010        00000000        10101000        11000000 
    
    

原文地址:https://blog.csdn.net/CodeHouse/article/details/142649975

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!