字节顺序简单的理解就是一组数据在内存中排列的数据,分大/小端顺序,其详细的介绍可以参考维基百科,本文主要介绍的是如何通过调试查看内存中变量的储存数据以及如何通过代码实现判断本机字节顺序。
我们经常使用的电脑是 intel x86 架构的 CPU,其使用的是小端序,在使用 VS 调试程序的过程中我们就能看出变量在内存中排布的方式。首选在程序中下个断点,然后运行程序,选择 “调试->窗口->内存->内存1”,这样在下方窗口中就出现一个内存的窗口。
在代码中打印一个变量在内存中的起始地址,然后从内存窗口中搜索到该地址,查看地址中存放的数据。
我们看到,一个 int 类型的变量(4个字节 4Byte)最低位 44 在内存的最地位位置上,通过这里我们就可以判断出来,我们的 CPU 是小端序。
维基百科上也介绍了哪些 CPU 是使用的是大端序、哪些是使用的小端序,而如果我们不清楚 CPU 型号时,可以通过编写一个程序来获得,第一种方式是将一个 4 字节的数值截断为 1 字节,通过读取这一个字节储存的数据来判断是大端还是小端序:
#include <iostream>
using namespace std;
int main( int argc, char* argv[])
{
int i = 0x11223344;
// 取 i 的地址,强制转换为 char* 类型,被解释为 1 个字节,再解引用该地址中一个字节的数据
char c = *(char*)&i;
if (c == 0x44)
{
cout << "Little endian" << endl;
}
else
{
cout << "Big endian" << endl;
}
return 0;
}
另外一种方式是借助函数 htonl() 该函数把本机字节序转换为网络字节序(大端序),我们判断如果原值等于被转换后的数据(大端序数据),那么我们的 CPU 就是大端序,反之则是小端序。代码如下(出自 C++ 黑客编程揭秘与防范):
#include <iostream>
#include <Winsock2.h>
#pragma comment ( lib, "Ws2_32")
using namespace std;
int main( int argc, char* argv[])
{
int i = 0x11223344;
if (i == htonl(i))
{
cout << "Big endian" << endl;
}
else
{
cout << "Little endian" << endl;
}
return 0;
}