8位、16位、32位数据相互转换,支持数组含代码

转换规则

大端模式(Big Endian):高位字节在前、低位字节在后(适配网络传输、多数传感器数据格式);
使用场景:网络通信、串口通信、传感器数据处理等实际开发场景
前缀规范:uint8_t、uint16_t、uint32_t,兼容 C/C++ 标准;

转换原理

1. 拼接原理(窄字节→宽字节)

核心逻辑:将多个窄字节(u8)按大端顺序,通过 “左移 + 按位或” 组合为宽字节(u16/u32);
示例(u8→u32):
4 个 u8(0x12、0x34、0x56、0x78)→ 1 个 u32(0x12345678);
运算:(0x12 << 24) | (0x34 << 16) | (0x56 << 8) | 0x78;

2. 拆分原理(宽字节→窄字节)

核心逻辑:将宽字节(u16/u32)按大端顺序,通过 “右移 + 强制类型转换” 拆分出单个窄字节(u8);
示例(u32→u8):
1 个 u32(0x12345678)→ 4 个 u8(0x12、0x34、0x56、0x78);
运算:(u32 >> 24)→0x12、(u32 >> 16)→0x34、(u32 >> 8)→0x56、(u32 & 0xFF)→0x78;

完整转换代码

代码注意事项

  1. 声明 #define MAX_DESTINATION_NUM 512 // 按需修改

  2. 使用C调用代码注意函数重名,CPP函数不必考虑

u8[] -> u32[]

/** 
 * @brief	 u8[] -> u32[] (Big Endian Convert) 
 * @param	[in]u8Source: u8[]
 * @param	[out]u32Destination: u32[]
 * @param	[in]NumDestination: u32 length
 * @note    u8Source.length >= 4*NumDestination
 * @retval	bool
**/
bool ArrayConvert(uint8_t *u8Source, uint32_t *u32Destination, uint32_t NumDestination)
{
    if ((u8Source == NULL) || (u32Destination == NULL))
    {
        return false;
    }
    if (NumDestination > MAX_DESTINATION_NUM)
    {
        return false;
    }
    for (uint32_t i = 0; i < NumDestination; i++)
    {
        u32Destination[i] = ((uint32_t)u8Source[i*4 + 0] << 24) |
                            ((uint32_t)u8Source[i*4 + 1] << 16) |
                            ((uint32_t)u8Source[i*4 + 2] << 8)  |
                             (uint32_t)u8Source[i*4 + 3];
    }
    return true;
}

u8[] -> u16[]

/** 
 * @brief	 u8[] -> u16[] (Big Endian Convert) 
 * @param	[in]u8Source: u8[]
 * @param	[out]u16Destination: u16[]
 * @param	[in]NumDestination: u16 length
 * @note    u8Source.length >= 2*NumDestination
 * @retval	bool
**/
bool ArrayConvert(uint8_t *u8Source, uint16_t *u16Destination, uint32_t NumDestination)
{
	if((u8Source == NULL) || (u16Destination == NULL))
	{
		return false;
	}
	if(NumDestination > MAX_DESTINATION_NUM)
	{
		return false;
	}
	for(uint32_t i = 0; i < NumDestination; i++)
	{
		u16Destination[i] = ((uint16_t)u8Source[i*2 + 0] << 8) | 
							((uint16_t)u8Source[i*2 + 1]);						
	}
	return true;	
}

u16[] -> u8[]

/** 
 * @brief	 u16[] -> u8[] (Big Endian Convert) 
 * @param	[in]u16Source: u16[]
 * @param	[out]u8Destination: u8[]
 * @param	[in]NumSource: u16 length
 * @note    u8Destination.length >= 2*NumSource
 * @retval	bool
**/
bool ArrayConvert(uint16_t *u16Source, uint8_t *u8Destination, uint32_t NumSource)
{
	if((u16Source == NULL) || (u8Destination == NULL))
	{
		return false;
	}
	if(NumSource > MAX_DESTINATION_NUM)
	{
		return false;
	}
	for(uint32_t i = 0; i < NumSource; i++)
	{
		u8Destination[i*2 + 0] = (uint8_t)(u16Source[i] >> 8);
		u8Destination[i*2 + 1] = (uint8_t)(u16Source[i] & 0xFF);					
	}
	return true;	
}

u32[] -> u8[]

/** 
 * @brief	 u32[] -> u8[] (Big Endian Convert) 
 * @param	[in]u32Source: u32[]
 * @param	[out]u8Destination: u8[]
 * @param	[in]NumSource: u32 length
 * @note    u8Destination.length >= 4*NumSource
 * @retval	bool
**/
bool ArrayConvert(uint32_t *u32Source, uint8_t *u8Destination, uint32_t NumSource)
{
	if((u32Source == NULL) || (u8Destination == NULL))
	{
		return false;
	}
	if(NumSource > MAX_DESTINATION_NUM)
	{
		return false;
	}
	for(uint32_t i = 0; i < NumSource; i++)
	{					 
		u8Destination[i*4 + 0] = (uint8_t)(u32Source[i] >> 24);
		u8Destination[i*4 + 1] = (uint8_t)(u32Source[i] >> 16);
		u8Destination[i*4 + 2] = (uint8_t)(u32Source[i] >> 8);
		u8Destination[i*4 + 3] = (uint8_t)(u32Source[i] & 0xFF);			
	}
	return true;	
}

使用示例

       // u8[] -> u32
       uint8_t u8a[4] = { 0x11, 0x22 ,0x33, 0x44 };
       uint32_t u32b;
       ArrayConvert(u8a, &u32b, 1);

     // u8[] -> u32[]
       uint8_t u8Source[16] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10 };
       uint32_t u32Destination[4];
       ArrayConvert(u8Source, u32Destination, 4);
posted @ 2025-12-03 11:16  农夫三拳001  阅读(89)  评论(0)    收藏  举报