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