

























所谓的big-endian(大尾)和little-endian(小尾)是针对数据在内存中存储的字节序而言的. 我举个例子:
int a = 1;
a这个数本身的16进制表示是0x00 00 00 01
在内存中怎么存储呢?
如果你的CPU是intel x86架构的(基本上就是通常我们说的奔腾cpu),那么就是0x01 0x00 0x00 0x00 , 这也就是所谓的little-endian, 低字节存放在内存的低位.
如果你的CPU是老式AMD系列的(很老很老的那种,因为最新的AMD系列已经是x86架构了), 它的字节序就是big-endian, 其内存存储就是
0x00 0x00 0x00 0x01在内存中从高字节开始存放。
现在世界上绝大多数的CPU都是little-endian。
了解big-endian和little-endian有什么作用?一个重要的作用就是了解在网络上不同的机器间的数据如何传输。
假设我们在网络上有两台机器A和B, 其中A为little-endian,B为big-endian
机器A要传输上面的整数a给机器B,如何传输呢?
过程是这样的:
机器A先把a在内存中的四个字节
转化为网络字节序
0x00 0x00 0x00 0x01,然后一个字节一个字节(从0x00到0x01)喂到网络上去
然后机器B从网络上一个字节一个字节地取出四个字节
后又会转化为本地字节序
0x00 0x00 0x00 0x01后放入内存。因而B正确地得到了来自A的数据a
如果数据缺少在网络上的字节序转换的话,情况会怎样呢?
机器A先把a由在内存的四个字节
一个字节一个字节地喂到网络上,然后机器B从网络上一个字节一个字节地收到
0x 01 0x00 0x00 0x00并放入到内存中, B认为他收到了0x01000000, 也就是十进制数1677216,这显然是错误的.
如何判断你的机器是什么字节序呢?
下面给出一个简单的函数
inline bool IsPlatformLittleEndian()
{
const int n = 1;
return *((char*)&n) ? true : false;
}

如何在big-endian和little-endian之间转换呢?
参考下面的函数
template <typename T>
void ReverseBytes(T& n)
{
unsigned char* p = (unsigned char*)&n;
std::reverse(p, p + sizeof(T));
}
下面给出一个测试的例子
#include <iostream>
#include <algorithm>
using namespace std;

inline bool IsPlatformLittleEndian()
{
const int n = 1;
return *((char*)&n) ? true : false;
}

template <typename T>
void ReverseBytes(T& n)
{
unsigned char* p = (unsigned char*)&n;
std::reverse(p, p + sizeof(T));
}

void main()
{
cout << "Your CPU is " << (IsPlatformLittleEndian() ? "Little" : "Big") << "-Endian" << endl;
int n = 1;
ReverseBytes(n);
cout << n << endl;
}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。