int float写入字节数据各字节序的实现

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等类型理用内存操作实现方法类似,只是相关变量类型变化为对应类型即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值