LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

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

freeflydom
2025年12月5日 10:13 本文热度 204

转换规则

大端模式(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);

 转自https://www.cnblogs.com/sheriffe/p/19301210


该文章在 2025/12/5 10:13:05 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved