转换规则
大端模式(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;
完整转换代码
代码注意事项
-
define MAX_DESTINATION_NUM 512 // 按需修改
-
使用C调用代码注意函数重名,CPP函数不必考虑
u8[] -> u32[]
/* by 01130.hk - online tools website : 01130.hk/zh/calcforce.html */
/**
* @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[]
/* by 01130.hk - online tools website : 01130.hk/zh/calcforce.html */
/**
* @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;
}
多字节数据转换及数组处理

被折叠的 条评论
为什么被折叠?



