int与字节数组转换比较简单,用变量位与oxff等和移位即可实现,因为变量位与0xff等已经不受计算机cpu大小端序的影响,可直接实现,如:
#define BYTE0_LITTLEEND(val) static_cast<unsigned char>((val) & 0xFF)
#define BYTE1_LITTLEEND(val) static_cast<unsigned char>(((val) & 0xFF00) >> 8)
#define BYTE2_LITTLEEND(val) static_cast<unsigned char>(((val) & 0xFF0000) >> 16)
#define BYTE3_LITTLEEND(val) static_cast<unsigned char>(((val) & 0xFF000000) >> 24)
#define BYTE4_LITTLEEND(val) static_cast<unsigned char>(((val) & 0xFF00000000) >> 32)
#define BYTE5_LITTLEEND(val) static_cast<unsigned char>(((val) & 0xFF0000000000) >> 40)
#define BYTE6_LITTLEEND(val) static_cast<unsigned char>(((val) & 0xFF000000000000) >> 48)
#define BYTE7_LITTLEEND(val) static_cast<unsigned char>(((val) & 0xFF00000000000000) >> 56)
#define BYTE0_BIGEND(val) static_cast<unsigned char>(((val) & 0xFF00000000000000) >> 56)
#define BYTE1_BIGEND(val) static_cast<unsigned char>(((val) & 0xFF000000000000) >> 48)
#define BYTE2_BIGEND(val) static_cast<unsigned char>(((val) & 0xFF0000000000) >> 40)
#define BYTE3_BIGEND(val) static_cast<unsigned char>(((val) & 0xFF00000000) >> 32)
#define BYTE4_BIGEND(val) static_cast<unsigned char>(((val) & 0xFF000000) >> 24)
#define BYTE5_BIGEND(val) static_cast<unsigned char>(((val) & 0xFF0000) >> 16)
#define BYTE6_BIGEND(val) static_cast<unsigned char>(((val) & 0xFF00) >> 8)
#define BYTE7_BIGEND(val) static_cast<unsigned char>((val) & 0xFF)
#define UINT8_2_UINT16_LITTLEEND(byte0, byte1) static_cast<unsigned short>((((byte1) & 0xFF) << 8) + ((byte0) & 0xFF))
#define UINT8_2_UINT16_BIGEND(byte0, byte1) static_cast<unsigned short>((((byte0) & 0xFF) << 8) + ((byte1) & 0xFF))
#define UINT8_2_UINT32_LITTLEEND(byte0, byte1, byte2, byte3) static_cast<unsigned int>((((byte3) & 0xFF) << 24) + (((byte2) & 0xFF) << 16) + (((byte1) & 0xFF) << 8) + ((byte0) & 0xFF))
#define UINT8_2_UINT32_BIGEND(byte0, byte1, byte2, byte3) static_cast<unsigned int>((((byte0) & 0xFF) << 24) + (((byte1) & 0xFF) << 16) + (((byte2) & 0xFF) << 8) + ((byte3) & 0xFF))
但是float存放用位与0xff和移位会有精度丢失的问题,需要用内存操作实现,可扩展性的实现是需要动态判断计算机的大小端序,代码如下:
/*******************************************
* 功能:判断CPU是否为小端序
* 返回值:
* bool:判断结果,true -- 小端序,false -- 大端序
* *****************************************/
bool isCPULittleEnd()
{
union
{
int iVal;
char cVal;
}Endian;
Endian.iVal = 1;
return (1 == Endian.cVal);
}
float数据分别按大小端写入字节数组代码如下:
/*******************************************
* 功能:float数据按小端序写入字节数组
* 输入参数:
* fVal:待转换的数据
* 输出参数:
* pData:写入float数据的小端序字节数组,空间至少可以存放4字节
* *****************************************/
void float2ArrByLittleEnd(const float fVal, char *pData)
{
char szData[4] = { 0 };
memcpy(szData, &fVal, sizeof(szData));
if (isCPULittleEnd())
{
//相同序
memcpy(pData, szData, sizeof(szData));
}
else
{
//相反序
pData[0] = szData[3];
pData[1] = szData[2];
pData[2] = szData[1];
pData[3] = szData[0];
}
return;
}
/*******************************************
* 功能:float数据按大端序写入字节数组
* 输入参数:
* fVal:待转换的数据
* 输出参数:
* pData:写入float数据的大端序字节数组,空间至少可以存放4字节
* *****************************************/
void float2ArrByBigEnd(const float fVal, char *pData)
{
char szData[4] = { 0 };
memcpy(szData, &fVal, sizeof(szData));
if (isCPULittleEnd())
{
//相反序
pData[0] = szData[3];
pData[1] = szData[2];
pData[2] = szData[1];
pData[3] = szData[0];
}
else
{
//相同序
memcpy(pData, szData, sizeof(szData));
}
return;
}
字节数组按大小端序写回float数据的代码如下:
/*******************************************
* 功能:小端序字节数组转float数据
* 输入参数:
* pData:小端序的字节数组
* 返回值:
* float:转换数据
* *****************************************/
float arr2FloatByLittleEnd(const char *pData)
{
float fVal = 0;
if (pData)
{
if (isCPULittleEnd())
{
//相同序
memcpy(&fVal, pData, 4);
}
else
{
//相反序
char szTemp[4] = { 0 };
for (int i = 0; i < 4; ++i)
{
szTemp[i] = pData[3 - i];
}
memcpy(&fVal, szTemp, 4);
}
}
return fVal;
}
/*******************************************
* 功能:大端序字节数组转float数据
* 输入参数:
* pData:大端序的字节数组
* 返回值:
* float:转换数据
* *****************************************/
float arr2FloatByBigEnd(const char *pData)
{
float fVal = 0;
if (pData)
{
if (isCPULittleEnd())
{
//相反序
char szTemp[4] = { 0 };
for (int i = 0; i < 4; ++i)
{
szTemp[i] = pData[3 - i];
}
memcpy(&fVal, szTemp, 4);
}
else
{
//相同序
memcpy(&fVal, pData, 4);
}
}
return fVal;
}
其余int、double、short等类型理用内存操作实现方法类似,只是相关变量类型变化为对应类型即可。