主机字节序和网络字节序,小端字节序和大端字节序?
主机字节序:就是在主机内部,数据在内存中的存储顺序,主机字节序通常分为小端字节序(Little Endian)和(Big Endian)。
小端字节序:内存的低地址存储地位低位字节,高地址存储高位字节。
大端字节序:内存的低地址存储高位字节,高地址存储地位字节。
我们为什么要知道区分主机是大端还是小端呢?因为网络字节序是大端字节序,所以不管我们主机采用了什么字节序,必须按照约定网络字节序发送,比如我们主机是小端字节序,那么我们要调用函数把我们的主机的字节序转为大端字节序,
怎么区分?
方法 一:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 int main() 6 { 7 int num = 0x12345678; //0x78为低位字节 ,0x12为高位字节 8 char* p = (char*)# //p指向num内存的低地址 9 if (*p == 0x78) //低地址存放低位字节 10 cout << "小端" << endl; 11 else cout << "大端" << endl; 12 13 return 0; 14 }
方法二:用联合体
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 union x 6 { 7 int x; 8 char y[4]; 9 }; 10 int main() 11 { 12 union x a; 13 a.x = 0x12345678; 14 if (a.y[0] == 0x78) cout << "小端" << endl; 15 else cout << "大端" << endl; 16 17 return 0; 18 }
注:我们通常使用的X86结构是小端模式,二KEIL则为大端模式,网络字节序为大端模式。