在C++中检测和转换字节序(ENDIAN)

转自:http://www.cppblog.com/johndragon/archive/2007/04/18/22201.html

在做跨平台的网络数据传输和文件数据转换和移植的时候,经常会碰到CPU字节序不同导致的各种各样的问题.
于是,在编写平台无关,字符编码无关的要求之外,又有一个新的对跨平台编码的要求,那就是字节序无关.
其实要实现这个也不难, 只要能够检测和转换字节序, 就完全可以实现.
下面提供各一种方法来解决这两个问题. 

//   检测平台的Endian
typedef union uEndianTest{
 struct
 {
  bool flittle_endian;
  bool fill[3];
 };
 long value;
}EndianTest;
static const EndianTest __Endian_Test__ = { (long)1 };
const bool platform_little_endian = __Endian_Test__.flittle_endian;

这样使用这个 platform_little_endian 就可以检测到当前平台是否是little_endian

//   Endian 转换(64位, 32位和16位的字节序转换)
//   中间使用了异或交换的算法
//   使用方法举例:
//   long lValue = 0xff000000;
//   ConvertEndian32( &lValue );
//   
inline void ConvertEndian64( LPVOID lpMem )
{
 BYTE * p = (BYTE*)lpMem;
 p[0] = p[0] ^ p[7];
 p[7] = p[0] ^ p[7];
 p[0] = p[0] ^ p[7];

 p[1] = p[1] ^ p[6];
 p[6] = p[1] ^ p[6];
 p[1] = p[1] ^ p[6];

 p[2] = p[2] ^ p[5];
 p[5] = p[2] ^ p[5];
 p[2] = p[2] ^ p[5];

 p[3] = p[3] ^ p[4];
 p[4] = p[3] ^ p[4];
 p[3] = p[3] ^ p[4];
}

inline void ConvertEndian32( LPVOID lpMem )
{
 BYTE * p = (BYTE*)lpMem;
 p[0] = p[0] ^ p[3];
 p[3] = p[0] ^ p[3];
 p[0] = p[0] ^ p[3];
 p[1] = p[1] ^ p[2];
 p[2] = p[1] ^ p[2];
 p[1] = p[1] ^ p[2];
}

inline void ConvertEndian16( LPVOID lpMem )
{
 BYTE * p = (BYTE*)lpMem;
 p[0] = p[0] ^ p[1];
 p[1] = p[0] ^ p[1];
 p[0] = p[0] ^ p[1];
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值