qt/c++中按位存储数据和按位解析数据

1、下面分别是数据按32位、16位、8位存储和数据按32位、16位、8位解析。

1.1 数据按32位存储

/*********函数说明-数据按32位存储******************/
/*********data-数据值***************/
/*********startBit-起始位***********/
/*********bitLen-位长***************/
/*********type-类型*****************/
QString dataToBit32(int data, int startBit, int bitLen, QString type)
{
	QString strData;
	int index = 0, length = 0; QBitArray temp_bit(32);

	index = length;
	for (int m = 0; m < startBit - index; m++)
	{
		temp_bit.setBit(length, 0); length++;
	}
	if (type == "bool" || type == "uchar" || type == "schar")
	{
		temp_bit.setBit(length, data); length++;
	}
	else if (type == "enum")
	{
		QBitArray tmpBit(8);
		// 将 char 按位存储到 QBitArray 中
		for (int i = 0; i < 8; ++i)
		{
			// 使用位操作提取第 i 位
			tmpBit.setBit(i, (data >> i) & 1);
		}
		for (int i = 0; i < bitLen; ++i)
		{
			temp_bit.setBit(length, tmpBit[i]); length++;
		}
	}
	
	quint32 result = 0;
	// 逐位提取并构建结果
	for (int i = 0; i < 32; ++i)
	{
		if (temp_bit.testBit(i))
		{
			result |= (1u << i);  // 将当前位设置为 1
		}
	}

	strData = QString::number(result);
	return strData;
}

1.2 数据按16位存储

/*********函数说明-数据按16位存储******************/
/*********data-数据值***************/
/*********startBit-起始位***********/
/*********bitLen-位长***************/
/*********type-类型*****************/
QString dataToBit16(int data, int startBit, int bitLen, QString type)
{
	QString strData;
	int index = 0, length = 0; QBitArray temp_bit(16);

	index = length;
	for (int m = 0; m < startBit - index; m++)
	{
		temp_bit.setBit(length, 0); length++;
	}
	if (type == "bool" || type == "uchar" || type == "schar")
	{
		temp_bit.setBit(length, data); length++;
	}
	else if (type == "enum")
	{
		QBitArray tmpBit(8);
		// 将 char 按位存储到 QBitArray 中
		for (int i = 0; i < 8; ++i)
		{
			// 使用位操作提取第 i 位
			tmpBit.setBit(i, (data >> i) & 1);
		}
		for (int i = 0; i < bitLen; ++i)
		{
			temp_bit.setBit(length, tmpBit[i]); length++;
		}
	}
	
	quint16 result = 0;
	// 逐位提取并构建结果
	for (int i = 0; i < 16; ++i)
	{
		if (temp_bit.testBit(i))
		{
			result |= (1u << i);  // 将当前位设置为 1
		}
	}

	strData = QString::number(result);
	return strData;
}

1.2 数据按8位存储

/*********函数说明-数据按8位存储******************/
/*********data-数据值***************/
/*********startBit-起始位***********/
/*********bitLen-位长***************/
/*********type-类型*****************/
QString dataToBit8(int data, int startBit, int bitLen, QString type)
{
	QString strData;
	int index = 0, length = 0; QBitArray temp_bit(8);

	index = length;
	for (int m = 0; m < startBit - index; m++)
	{
		temp_bit.setBit(length, 0); length++;
	}
	if (type == "bool" || type == "uchar" || type == "schar")
	{
		temp_bit.setBit(length, data); length++;
	}
	else if (type == "enum")
	{
		QBitArray tmpBit(8);
		// 将 char 按位存储到 QBitArray 中
		for (int i = 0; i < 8; ++i)
		{
			// 使用位操作提取第 i 位
			tmpBit.setBit(i, (data >> i) & 1);
		}
		for (int i = 0; i < bitLen; ++i)
		{
			temp_bit.setBit(length, tmpBit[i]); length++;
		}
	}
	
	quint8 result = 0;
	// 逐位提取并构建结果
	for (int i = 0; i < 8; ++i)
	{
		if (temp_bit.testBit(i))
		{
			result |= (1u << i);  // 将当前位设置为 1
		}
	}

	strData = QString::number(result);
	return strData;
}

2.1 数据按32位解析

/*********函数说明-数据按32位解析*****/
/*********value-数据值**************/
/*********startBit-起始位***********/
/*********numBits-位长**************/
int parseIntFromBits(int value, int startBit, int numBits)
{
	QBitArray bitArray(32);  // 创建一个 32 位的 QBitArray
	// 将 uint 值转换为 QBitArray
	for (int i = 0; i < 32; ++i)
	{
		// 将当前位的值存储到 QBitArray
		bitArray.setBit(i, (value >> i) & 1);
	}

	quint32 result = 0;

	// 提取指定的位
	for (int i = 0; i < numBits; ++i)
	{
		if (bitArray.testBit(startBit + i))
		{
			result |= (1u << i);  // 设置结果中的相应位
		}
	}
	return result;
}

2.2 数据按16位解析

/*********函数说明-数据按16位解析*****/
/*********value-数据值**************/
/*********startBit-起始位***********/
/*********numBits-位长**************/
int parseIntFromBits(int value, int startBit, int numBits)
{
	QBitArray bitArray(16);  // 创建一个 16 位的 QBitArray
	// 将 uint 值转换为 QBitArray
	for (int i = 0; i < 16; ++i)
	{
		// 将当前位的值存储到 QBitArray
		bitArray.setBit(i, (value >> i) & 1);
	}

	16 result = 0;

	// 提取指定的位
	for (int i = 0; i < numBits; ++i)
	{
		if (bitArray.testBit(startBit + i))
		{
			result |= (1u << i);  // 设置结果中的相应位
		}
	}
	return result;
}

2.3 数据按8位解析

/*********函数说明-数据按8位解析*****/
/*********value-数据值**************/
/*********startBit-起始位***********/
/*********numBits-位长**************/
int parseIntFromBits(int value, int startBit, int numBits)
{
	QBitArray bitArray(8);  // 创建一个 8 位的 QBitArray
	// 将 uint 值转换为 QBitArray
	for (int i = 0; i < 8; ++i)
	{
		// 将当前位的值存储到 QBitArray
		bitArray.setBit(i, (value >> i) & 1);
	}

	8 result = 0;

	// 提取指定的位
	for (int i = 0; i < numBits; ++i)
	{
		if (bitArray.testBit(startBit + i))
		{
			result |= (1u << i);  // 设置结果中的相应位
		}
	}
	return result;
}

版权声明:本文为博主原创文章,转载请附上博文链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值