主机字节序和网络字节序,小端字节序和大端字节序?

发布时间 2023-11-03 11:41:34作者: 潘阳399

主机字节序:就是在主机内部,数据在内存中的存储顺序,主机字节序通常分为小端字节序(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*)&num;  //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则为大端模式,网络字节序为大端模式。