## 1. 嵌入式系统中的数据格式转换技术 ### 1.1 字符串与十六进制互转 #### 字符串转十六进制实现 c void StrToHex(char *pbDest, char *pbSrc, int nLen) { char h1,h2; char s1,s2; int i; for(i0; inLen/2; i) { h1 pbSrc[2*i]; h2 pbSrc[2*i1]; s1 toupper(h1) - 0x30; //toupper 转换为大写字母 if(s1 9) s1 - 7; s2 toupper(h2) - 0x30; if(s2 9) s2 - 7; pbDest[i] s1*16 s2; } }技术要点每两个字符转换为一个十六进制字节使用toupper()统一字符大小写ASCII码转换时处理A-F的特殊情况十六进制转字符串实现void HexToStr(char *pszDest, char *pbSrc, int nLen) { char ddl, ddh; for(int i 0; i nLen; i) { ddh 48 pbSrc[i] / 16; ddl 48 pbSrc[i] % 16; if(ddh 57) ddh ddh 7; if(ddl 57) ddl ddl 7; pszDest[i * 2] ddh; pszDest[i * 2 1] ddl; } pszDest[nLen * 2] \0; }替代方案u16 Hex2StringArray(u8 *pSrc, u16 SrcLen, u8 *pObj) { u16 i0; for(i0; iSrcLen; i) { sprintf((char *)(pObj i * 2), %02X, *(pSrc i)); } *(pObj i * 2) \0; return (i * 2); }1.2 字符串与十进制转换带符号字符串转整数(atoi实现)int my_atoi(const char *str) { int value 0; int flag 1; //判断符号 while(*str ) str; //跳过空格 if(*str -) { flag 0; str; } else if(*str ) { flag 1; str; } else if(*str 9 || *str 0) return 0; while(*str ! \0 *str 9 *str 0) { value value * 10 *str - 0; str; } return flag ? value : -value; }无符号字符串转十进制void StrtoDec(uint32_t *pbDest, char *pbSrc, int nLen) { int i; int tmp0; if(nLen 10) *pbDest 0; tmp 1; *pbDest 0; for(inLen-1; i0; i--) { *pbDest tmp*(*(pbSrci)-0); tmp tmp*10; } }浮点数字符串转换u32 NMEA_Pow(u8 m,u8 n) { u32 result1; while(n--)result*m; return result; } int NMEA_Str2num(u8 *buf,u8*dx) { u8 *pbuf; u32 ires0,fres0; u8 ilen0,flen0,i; u8 mask0; int res; while(1) //解析整数和小数部分 { if(*p-){mask|0X02;p;} if(*p,||(*p*)) break; if(*p.){mask|0X01;p;} else if(*p9||(*p0)) {ilen0;flen0;break;} if(mask0X01)flen; else ilen; p; } if(mask0X02)buf; //处理负数 for(i0;iilen;i) iresNMEA_Pow(10,ilen-1-i)*(buf[i]-0); if(flen5)flen5; //限制小数位数 *dxflen; for(i0;iflen;i) fresNMEA_Pow(10,flen-1-i)*(buf[ilen1i]-0); resires*NMEA_Pow(10,flen)fres; return (mask0X02)?-res:res; }1.3 数值与字节数组转换u32转u8数组void U32ToU8Array(uint8_t *buf, uint32_t u32Value) { buf[0] ((u32Value 24) 0xFF); buf[1] ((u32Value 16) 0xFF); buf[2] ((u32Value 8) 0xFF); buf[3] (u32Value 0xFF); }u8数组转u32void U8ArrayToU32(uint8_t *buf, uint32_t *u32Value) { *u32Value (buf[0] 24) (buf[1] 16) (buf[2] 8) (buf[3] 0); }1.4 大小端处理技术大端模式转换pPack[0] (u8)((len 8) 0xFF); //高字节在前 pPack[1] (u8)(len 0xFF);小端模式转换pPack[0] (u8)(len 0xFF); //低字节在前 pPack[1] (u8)((len 8) 0xFF);典型应用场景网络协议处理通常采用大端序跨平台数据交换外设寄存器配置
嵌入式系统数据格式转换技术详解
发布时间:2026/6/5 7:19:37
## 1. 嵌入式系统中的数据格式转换技术 ### 1.1 字符串与十六进制互转 #### 字符串转十六进制实现 c void StrToHex(char *pbDest, char *pbSrc, int nLen) { char h1,h2; char s1,s2; int i; for(i0; inLen/2; i) { h1 pbSrc[2*i]; h2 pbSrc[2*i1]; s1 toupper(h1) - 0x30; //toupper 转换为大写字母 if(s1 9) s1 - 7; s2 toupper(h2) - 0x30; if(s2 9) s2 - 7; pbDest[i] s1*16 s2; } }技术要点每两个字符转换为一个十六进制字节使用toupper()统一字符大小写ASCII码转换时处理A-F的特殊情况十六进制转字符串实现void HexToStr(char *pszDest, char *pbSrc, int nLen) { char ddl, ddh; for(int i 0; i nLen; i) { ddh 48 pbSrc[i] / 16; ddl 48 pbSrc[i] % 16; if(ddh 57) ddh ddh 7; if(ddl 57) ddl ddl 7; pszDest[i * 2] ddh; pszDest[i * 2 1] ddl; } pszDest[nLen * 2] \0; }替代方案u16 Hex2StringArray(u8 *pSrc, u16 SrcLen, u8 *pObj) { u16 i0; for(i0; iSrcLen; i) { sprintf((char *)(pObj i * 2), %02X, *(pSrc i)); } *(pObj i * 2) \0; return (i * 2); }1.2 字符串与十进制转换带符号字符串转整数(atoi实现)int my_atoi(const char *str) { int value 0; int flag 1; //判断符号 while(*str ) str; //跳过空格 if(*str -) { flag 0; str; } else if(*str ) { flag 1; str; } else if(*str 9 || *str 0) return 0; while(*str ! \0 *str 9 *str 0) { value value * 10 *str - 0; str; } return flag ? value : -value; }无符号字符串转十进制void StrtoDec(uint32_t *pbDest, char *pbSrc, int nLen) { int i; int tmp0; if(nLen 10) *pbDest 0; tmp 1; *pbDest 0; for(inLen-1; i0; i--) { *pbDest tmp*(*(pbSrci)-0); tmp tmp*10; } }浮点数字符串转换u32 NMEA_Pow(u8 m,u8 n) { u32 result1; while(n--)result*m; return result; } int NMEA_Str2num(u8 *buf,u8*dx) { u8 *pbuf; u32 ires0,fres0; u8 ilen0,flen0,i; u8 mask0; int res; while(1) //解析整数和小数部分 { if(*p-){mask|0X02;p;} if(*p,||(*p*)) break; if(*p.){mask|0X01;p;} else if(*p9||(*p0)) {ilen0;flen0;break;} if(mask0X01)flen; else ilen; p; } if(mask0X02)buf; //处理负数 for(i0;iilen;i) iresNMEA_Pow(10,ilen-1-i)*(buf[i]-0); if(flen5)flen5; //限制小数位数 *dxflen; for(i0;iflen;i) fresNMEA_Pow(10,flen-1-i)*(buf[ilen1i]-0); resires*NMEA_Pow(10,flen)fres; return (mask0X02)?-res:res; }1.3 数值与字节数组转换u32转u8数组void U32ToU8Array(uint8_t *buf, uint32_t u32Value) { buf[0] ((u32Value 24) 0xFF); buf[1] ((u32Value 16) 0xFF); buf[2] ((u32Value 8) 0xFF); buf[3] (u32Value 0xFF); }u8数组转u32void U8ArrayToU32(uint8_t *buf, uint32_t *u32Value) { *u32Value (buf[0] 24) (buf[1] 16) (buf[2] 8) (buf[3] 0); }1.4 大小端处理技术大端模式转换pPack[0] (u8)((len 8) 0xFF); //高字节在前 pPack[1] (u8)(len 0xFF);小端模式转换pPack[0] (u8)(len 0xFF); //低字节在前 pPack[1] (u8)((len 8) 0xFF);典型应用场景网络协议处理通常采用大端序跨平台数据交换外设寄存器配置