【嵌入式C】数据的大小端存储与数据格式转换

【嵌入式C】数据的大小端存储与数据格式转换

目录

  • 1. 大小端存储格式图解
  • 2. 数据类型转换函数
    • 2.1 u8数组转u16
    • 2.2 u16数转u8数组

资料:【嵌入式数据传输及存储的C语言实现】

Cortex-M内核为例,实际应用中大部分内核都是 **小端 **存储,以STM32为例,全部都是小端,而且是芯片设计之初就固化进去的,不可修改

1. 大小端存储格式图解

通俗的将:

  • 大端:低字节存储在高地址,高字节存储在低地址
  • 小端:低字节存储在低地址,高字节存储在高地址 低低,高高
    【嵌入式C】数据的大小端存储与数据格式转换_第1张图片

2. 数据类型转换函数

u8 数组与 u16 数值的转换

【嵌入式C】数据的大小端存储与数据格式转换_第2张图片

2.1 u8数组转u16

//  uModeFlag:  1  big-endian    0: little-endian
uint16_t u8Arry2u16(uint8_t *pBuffer, uint8_t uModeFlag)
{
    uint16_t uShort = 0;
	uShort = *pBuffer++;
    if(1 == uModeFlag){
		uShort = (uShort << 8) | (*pBuffer);
	}else if(0 == uModeFlag){
		uShort |= (*pBuffer) << 8;
	}
	return uShort;	
}

// 测试
uint8_t arry[2] = {0xC0,0x01};
uint16_t value;
value = u8Arry2u16(arry,1);   // 大端,输出 0xC001
printf("0x%04x, ",value);

value = u8Arry2u16(arry,0); // 小端,输出 0x01c0
printf("0x%04x, ",value);

【嵌入式C】数据的大小端存储与数据格式转换_第3张图片

2.2 u16数转u8数组

//  uModeFlag:  1  big-endian    0: little-endian
void u16_to_u8_Arry(uint16_t srcdata,uint8_t *destdata,uint8_t uModeFlag)
{
    switch (uModeFlag)
    {
        case 1:{
            *(destdata) = (uint8_t)(srcdata >>8 & 0xFF); 
            *(destdata +1)    = (uint8_t)(srcdata & 0xFF); 
            break;
        }

        case 0:{
            *(destdata+1) = (uint8_t)(srcdata >>8 & 0xFF); //
            *destdata     = (uint8_t)(srcdata & 0xFF); // 
            break;
        }
        default:
            break;
    }
}

// 测试
    uint16_t val = 0xc001;

    u16_to_u8_Arry(val,arry,1);
    printf("0x%02x,",arry[0]);
    printf("0x%02x, \r\n ",arry[1]);   // 0xc0 0x01

    u16_to_u8_Arry(val,arry,0);
    printf("0x%02x,",arry[0]);
    printf("0x%02x, \r\n ",arry[1]);   // 0x01,0xc0

【嵌入式C】数据的大小端存储与数据格式转换_第4张图片

你可能感兴趣的:(嵌入式,C语言笔记,c语言,开发语言,物联网,嵌入式C,单片机)