判断主机字节序大端规则或小端规则方法
大端规则与小端规则
在计算机存储中存储字节的顺序有两种分别为大端规则和小端规则。
- 小端规则(littel endian):低序字节存储到内存较低的位置,即起始位置。
- 大端规则(big endian):低序字节存储到内存较高的位置,即高序字节存储到起始位置。
有一个32位数字为:0x01020304
在小端规则的机器上,其存储如下:
低地址 |
-> |
-> |
高地址 |
0x04 |
0x03 |
0x02 |
0x01 |
在大端规则机器上,其存储如下:
低地址 |
-> |
-> |
高地址 |
0x01 |
0x02 |
0x03 |
0x04 |
判断当前机器字节序的方法
判断当前机器为大端规则还是小端规则,其本质是对于一个变量,判断其各字节的存储顺序,
方法一:使用union判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <iostream> using namespace std; int main() { union { short a; char c[2]; } u; u.a = 0x0102; if (u.c[0] == 2 && u.c[1] == 1) { std::cout << "little" << std::endl; } else if (u.c[0] == 1 && u.c[1] == 2) { std::cout << "big" << std::endl; } else { std::cout << "unkown" << std::endl; } return 0; }
|
方法二:直接将字节取出,判断顺序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <iostream> using namespace std; int main() { short s = 0x0102; char* a = (char*)(&s); std::cout << (*a) << std::endl; char b = 0x02, c = 0x01; if (((*a) | b) == b) { std::cout << "little" << std::endl; } else if (((*a) | c) == b) { std::cout << "big" << std::endl; } else { std::cout << "unknow" << std::endl; } return 0; }
|