|
1、字符串转十六进制 " h3 {+ a U+ N8 B `, @7 [1 A 代码实现: 1 q! x; T" g% _ W8 d void StrToHex(char *pbDest, char *pbSrc, int nLen)' a9 j" O" N! ]9 S" K+ C* {* |{ char h1,h2; C5 i* V6 p: _- ^ char s1,s2; int i; for (i=0; i<nLen/2; i++)8 X C3 E. ], z% H: C/ u {2 L0 g. Q8 a# {% P V h1 = pbSrc[2*i];" ^- ~, J6 p! t% [$ W4 Y h2 = pbSrc[2*i+1];. f3 M; Z# r F5 Z5 V! U6 i s1 = toupper(h1) - 0x30; //toupper 转换为大写字母: g6 P3 ~- s H if (s1 > 9)# x: `$ M$ Q( n s1 -= 7; s2 = toupper(h2) - 0x30; if (s2 > 9) s2 -= 7;9 B2 |5 G. a/ P3 P pbDest = s1*16 + s2;- v" u% ^' j9 \$ d# {& w# L }, E; o; Q& q* c( y. M( u7 M- j } ( ?4 O% o! n0 i, ^2 Q, ? 2、十六进制转字符串 代码实现: 0 Z. [& U0 } h! g( F1 N1 r void HexToStr(char *pszDest, char *pbSrc, int nLen)- d: m; {' _& B% h/ H* J/ u9 J{. W# b! B2 @. j7 F6 J5 p9 _) m char ddl, ddh;8 H- p! ]* Q4 W) {+ N, j& a for (int i = 0; i < nLen; i++) {) V+ N3 a. X1 c6 H8 F N; N ddh = 48 + pbSrc / 16; ddl = 48 + pbSrc % 16; A8 c- Z5 j9 s if (ddh > 57) ddh = ddh + 7;$ }1 z1 S4 L$ C" W if (ddl > 57) ddl = ddl + 7; pszDest[i * 2] = ddh; pszDest[i * 2 + 1] = ddl; }* D& l! S0 W0 g& u2 p pszDest[nLen * 2] = '\0';0 |+ q! l& F0 ` }. l4 D+ n+ C; e( `2 W! R 或者 u16 Hex2StringArray (u8 *pSrc, u16 SrcLen, u8 *pObj){- G2 l+ [" y$ n0 H; i. E6 D" j u16 i=0; ' X0 Q9 I& Q+ {% H for(i=0; i<SrcLen; i++); w3 O2 q3 d7 V2 ] {( s' a7 ?$ \3 N# ?+ C" c1 ` sprintf((char *)(pObj + i * 2), "%02X", *(pSrc + i)); } *(pObj + i * 2) = '\0';5 V7 _ I9 r5 m$ e, n return (i * 2); }) e% }( }! L% D- r& r# @7 h+ T 效果:十六进制:0x13 0xAA 0x02转为字符串:”13AAA2” 代码实现: 第一种,如果带负号 这个就是atoi函数的实现: { int value = 0; int flag = 1; //判断符号4 Q1 z6 c4 j b% ^/ P while (*str == ' ') //跳过字符串前面的空格# V8 F% V) _4 W0 O6 w4 } {2 `# j @$ N! g0 B6 b str++; } if (*str == '-') //第一个字符若是‘-’,说明可能是负数 {. q" Q* g" Y$ p! R5 J# N flag = 0; str++; } P" U, h+ p; V else if (*str == '+') //第一个字符若是‘+’,说明可能是正数$ { [, D1 \/ z0 U' R' l {3 b. x2 k% R, c flag = 1; str++;. I. G+ h6 N4 N9 t3 o/ y6 J4 b }//第一个字符若不是‘+’‘-’也不是数字字符,直接返回0 else if (*str >= '9' || *str <= '0') ( E* @; O0 N' r { return 0; }% r2 u, s/ @2 \0 f5 h //当遇到非数字字符或遇到‘\0’时,结束转化. C$ [2 d3 \ d5 M, w) T8 o+ s; O while (*str != '\0' && *str <= '9' && *str >= '0') { value = value * 10 + *str - '0'; //将数字字符转为对应的整形数 str++;' F) O( r5 \ o/ N' ~) y }( W5 }' ~4 \2 z: ?4 A0 I' V1 d if (flag == 0) //负数的情况 {. S1 }; h4 N) W value = -value; }6 v+ Q8 e: |- L9 [' ~ return value; }& g. u% W9 P& O4 c+ W 9 |# b! a; k5 p, ?6 a- E" A# M 效果:字符串:”-123” 转为 -123 % s2 S+ P4 s2 L A$ K4 w 第二种,如果不带负号: {; }9 G" N8 h* x# }: K8 n int i; int tmp=0;" x% {$ P. I4 _4 ~7 Z9 r) b if(nLen > 10)4 g; {+ W. [ t2 S& D- u *pbDest = 0;/ @( S9 X" W1 [4 b3 D0 m; \' ^ tmp = 1;1 D1 z4 T" V/ \- J *pbDest = 0;* B# t# N1 j% [$ y7 W2 } for (i=nLen-1; i>=0; i--)# K5 Y& U" u& W8 D5 V0 C4 `% Y3 o- Q { *pbDest += tmp*(*(pbSrc+i)-'0'); tmp = tmp*10; } } $ I, W/ {* x; C5 A* P( F! Z 效果:字符串:”123” 转为 123 第三种:包含转为浮点数: //返回值:m^n次方.6 s9 g! N/ Z" W" M f& A* _9 N u32 NMEA_Pow(u8 m,u8 n)) ^, b A4 ~$ R+ [$ t. J# F2 s' \ { u32 result=1; * h$ q* v( V( A, b x while(n--)result*=m; return result; } //str转换为数字,以','或者'*'结束6 L7 G! X6 B$ c- t4 I //buf:数字存储区 //dx:小数点位数,返回给调用函数 //返回值:转换后的数值 int NMEA_Str2num(u8 *buf,u8*dx) {, C2 i) [) p f1 K `, Y u8 *p=buf; u32 ires=0,fres=0;7 d4 S$ W% Z# |- u$ h: Z u8 ilen=0,flen=0,i; u8 mask=0; int res; while(1) //得到整数和小数的长度1 L+ q9 K1 S c! ~! e/ _, _ c { if(*p=='-'){mask|=0X02;p++;}//是负数! l M1 z1 L0 k% G if(*p==','||(*p=='*'))break;//遇到结束了/ W, I# B+ i: v0 U9 \* u+ { if(*p=='.'){mask|=0X01;p++;}//遇到小数点了5 `$ f4 n9 I+ k, }( k% G& q; X, x else if(*p>'9'||(*p<'0')) //有非法字符 { 2 W: [8 O3 z+ W' V/ L9 p; I ilen=0;& c/ j3 n. M9 O: N! v flen=0;( h" Q% t0 R1 P: y. G4 E; a- ~ break; } 9 o1 b: \3 e) U% L) r if(mask&0X01)flen++; else ilen++;% j5 n4 C2 ~2 Z+ ~& L p++; } if(mask&0X02)buf++; //去掉负号 for(i=0;i<ilen;i++) //得到整数部分数据" f* N' @$ X0 v0 | { 8 t. c2 o7 ~$ @0 }* ` ires+=NMEA_Pow(10,ilen-1-i)*(buf-'0');* o. c9 U8 @. u2 k6 P }/ ~; q$ s" b2 l6 _; v6 y V if(flen>5)flen=5; //最多取5位小数: \( A& b- x9 r/ p: E' C" c *dx=flen; //小数点位数+ \" T% C5 s# N1 v4 r; v for(i=0;i<flen;i++) //得到小数部分数据, f ~" M8 b% v4 f$ n6 y6 T { fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0');/ t( m# d% b2 y p& m } res=ires*NMEA_Pow(10,flen)+fres; if(mask&0X02)res=-res; return res; } 7 L' ^! }# E6 g( J3 P9 I) I 效果:字符串:”123.456” 先转为 123456,然后除以1000得到123.456 - X% n' f% n9 ]' H9 e d5 {4 h4、十进制转字符串 ' t* B* ?4 s: a' A+ O7 g 代码实现: 9 ^9 v% j! w. V0 w- ] 如果只是单个十进制转字符串,使用sprintf函数就可以了。 如果是十进制数组: 8 O$ {$ b" j% [8 r9 x7 K/ I- j u16 DectoStr (u8 *pSrc, u16 SrcLen, u8 *pObj)- I* T6 p/ Y6 T5 i( k4 ]% P{ u16 i=0; for(i=0; i<SrcLen; i++) { sprintf((char *)(pObj + i * 2), "%02d", *(pSrc + i));5 M8 I% C5 L, U2 X9 j }% o# q; p$ O# B5 @- ~ J *(pObj + i * 2) = '\0'; return (i * 2); } 效果:十进制数组13 14转为字符串“1314” 1 ]9 \7 ?( u/ l$ P8 S# E* j! r5、u8、u32转换 举个栗子:ASCII码里 + ~" s9 V0 v6 x' q 这里写图片描述 字符‘A’ , 一个字节8bit ,即u8 十六进制为 0x41 二进制为 0100 0001 而对应的十进制为 65 整型65,4个字节32bit,即u32 十六进制为 0x41 二进制为 0000 0000 0000 0000 0000 0000 0100 0001 7 H+ E; I6 b* E6 s7 p- q; A4 ?$ Y 将u32数转换成u8数组 8 X" Y! _% k Y* [. a' `: w 注意:这里是字符数组,不是字符串 字符串是以空字符(\0)结尾的char数组 buf[0] = ((u32Value >> 24) & 0xFF); buf[1] = ((u32Value >> 16) & 0xFF); buf[2] = ((u32Value >> 8) & 0xFF);/ Z4 F" _/ O* v8 U buf[3] = (u32Value & 0xFF);" H O8 P+ H1 D: N$ l$ Q5 y }2 s0 k( y, R! a$ O k/ z 效果:整型 50 转字符数组 {‘\0’,’\0’,’\0’,’2’} 0 J7 z5 C3 p+ P u8数组转u32 { *u32Value = (buf[0] <<24) + (buf[1] <<16) + (buf[2] <<8) + (buf[3] <<0); q6 w6 {. N' s5 r" n& E }- R4 U S t' w1 t% |9 g ) @# F3 w9 z5 y5 f* a; d: J 效果:字符数组 {‘\0’,’\0’,’\0’,’2’}转为整型 50 4 Y) V% r& l" |: d" I% O( S& V t6、大端小端 最后就是大小端问题了。STM32 默认是小端模式的,那么该如何转为大端? ' X- o& I9 B4 W, a; }% T. b 1、转为大端 1 w( G" d0 L9 e6 w 为大端:3 {; }+ O/ U) I0 w9 M1 H; ppPack[0] = (u8)((len >> 8) & 0xFF);) O7 ~" ], R( K- @% T. o; m pPack[1] = (u8)(len & 0xFF);! @, n/ @* U- @# A; C 为小端: pPack[0] = (u8)(len & 0xFF);; j( C, d5 g; Q& H7 e8 i- A' D pPack[1] = (u8)((len >> 8) & 0xFF);7 j. [, X* c9 @. `/ T. z2 M# ]3 I # N5 b% m& k8 S& z! r! H 效果:len为数据类型为 u16(short),比如 0x11 0x22,转为u8(usigned char)数组。 3 A' R& l' z) p( ~2 O6 ]$ L 大端为: pPack[1] (0x22) e3 w/ b7 J3 V 小端为: & S1 _5 v5 ^2 x& e0 w% \$ g$ [ pPack[0] (0x22) pPack[1] (0x11) |
微信公众号
手机版