|
1、字符串转十六进制 代码实现: { char h1,h2;1 ?+ ?# j: `$ C4 F/ p1 Y2 Y) o char s1,s2; int i; for (i=0; i<nLen/2; i++)2 I( n! ~$ ^2 G% b% w) d { h1 = pbSrc[2*i];: K; C/ P* l. g$ j$ f0 R h2 = pbSrc[2*i+1]; s1 = toupper(h1) - 0x30; //toupper 转换为大写字母) @$ G* f6 Q8 G, t if (s1 > 9): ~6 y3 s' m! H! s s1 -= 7; s2 = toupper(h2) - 0x30; if (s2 > 9) s2 -= 7; * M( e6 }1 ~& ]; }+ F pbDest = s1*16 + s2;0 d; P# K( E! j: D6 ^8 c' h }: h. t7 I% W& @3 w7 h% b- q } * _( y2 h$ b l$ H- l! n" o 2、十六进制转字符串 代码实现: {' K2 {( s W& T+ l A# W. f! f char ddl, ddh; for (int i = 0; i < nLen; i++) {, \8 H; ?* M% c ddh = 48 + pbSrc / 16; ddl = 48 + pbSrc % 16;/ S2 G+ @+ P6 G2 r0 h- j if (ddh > 57) ddh = ddh + 7;* Y) E0 M b5 }+ A& M if (ddl > 57) ddl = ddl + 7; pszDest[i * 2] = ddh; pszDest[i * 2 + 1] = ddl; } \6 r8 L; y5 g P. w2 o; W: a pszDest[nLen * 2] = '\0'; } 或者 u16 Hex2StringArray (u8 *pSrc, u16 SrcLen, u8 *pObj){5 ]* @. h% ?! {# `2 m; _) q# s1 ?: x# Z u16 i=0;5 ]5 n# r( n" ?& w4 e7 } for(i=0; i<SrcLen; i++)2 P! E5 k: f. D. C { sprintf((char *)(pObj + i * 2), "%02X", *(pSrc + i));5 N& s1 M/ F4 b }' E1 E" ?; L6 G/ t/ m* d g *(pObj + i * 2) = '\0';1 v, l% A! O. e. V return (i * 2); } 效果:十六进制:0x13 0xAA 0x02转为字符串:”13AAA2” & w3 c, }& p5 F9 v! l 3、字符串转十进制代码实现: 7 K q6 O; i+ e& T) y" E# B 第一种,如果带负号 这个就是atoi函数的实现: , V# ?+ G8 L9 ~7 e int my_atoi(const char *str)/ w7 v: L$ G P6 V{ int value = 0;! s" N" _- _, u* p9 h4 u' t' W- G int flag = 1; //判断符号 while (*str == ' ') //跳过字符串前面的空格 {# Z+ d1 H' I V8 v! _ str++; } if (*str == '-') //第一个字符若是‘-’,说明可能是负数! {7 Y" ?2 W2 a% c { flag = 0; str++;, _% w) A9 R3 v6 P7 f4 s& E1 I: z } else if (*str == '+') //第一个字符若是‘+’,说明可能是正数& z8 R9 n6 H( g2 S7 ~ { flag = 1;$ e4 z/ Y3 e: @ str++; }0 w) |8 i) v5 w, O4 ~1 v. c }//第一个字符若不是‘+’‘-’也不是数字字符,直接返回0: d2 X7 N0 ~7 O/ S! [ else if (*str >= '9' || *str <= '0') {( y( h: Z3 [ V% x3 n) L return 0; } //当遇到非数字字符或遇到‘\0’时,结束转化 while (*str != '\0' && *str <= '9' && *str >= '0') { value = value * 10 + *str - '0'; //将数字字符转为对应的整形数 str++; }2 J ?% H' @2 r& M( p; @% } if (flag == 0) //负数的情况% e$ V& i3 y4 U9 |, ^ { value = -value;/ O1 _: A3 Z: C: r: ?+ l }- p5 r( H9 D! B return value;' J" Q+ l2 K0 ]# M } 效果:字符串:”-123” 转为 -123 第二种,如果不带负号: { int i;" X8 z1 v' m& L int tmp=0; if(nLen > 10) *pbDest = 0; tmp = 1;& @$ C9 e3 f' L. a *pbDest = 0; for (i=nLen-1; i>=0; i--) { *pbDest += tmp*(*(pbSrc+i)-'0'); tmp = tmp*10;! _6 R U) G/ F1 B; z, B* P" x, q# {) S } o* W' w) b l* A4 C }& ^ {/ l. k: Q) @6 H" i9 V 效果:字符串:”123” 转为 123 第三种:包含转为浮点数: //返回值:m^n次方. u32 NMEA_Pow(u8 m,u8 n)* F, D5 Z9 o7 E {0 D b7 N8 E7 o, `4 D u32 result=1; while(n--)result*=m; return result;( s6 l- c0 j* W- o) X: l }1 g0 O2 t- v8 e% n0 e# W //str转换为数字,以','或者'*'结束 //buf:数字存储区 //dx:小数点位数,返回给调用函数7 U) I3 G) W) L) I //返回值:转换后的数值' t5 K1 w0 L2 d! [3 u int NMEA_Str2num(u8 *buf,u8*dx)9 V& Q. W1 Y- k { u8 *p=buf;; \6 n3 J% h9 _8 I; m" G- p* n u32 ires=0,fres=0;9 H& s, i( P- ^6 s4 v u8 ilen=0,flen=0,i;4 D; W9 V7 Y7 y$ p% E a# [" U4 S6 y u8 mask=0; int res;1 F- ]* p8 }2 s7 {$ U while(1) //得到整数和小数的长度6 ?+ {" V0 X, o f' j; ^/ W {$ X8 e( l3 G/ x/ v4 N if(*p=='-'){mask|=0X02;p++;}//是负数 if(*p==','||(*p=='*'))break;//遇到结束了9 V5 S+ _+ e: R" K8 }! K if(*p=='.'){mask|=0X01;p++;}//遇到小数点了3 z- v/ p$ C8 p else if(*p>'9'||(*p<'0')) //有非法字符 { ilen=0; flen=0;1 C" H3 N5 `" g4 z8 q# w break; } if(mask&0X01)flen++; else ilen++; p++;9 E$ w4 g3 C4 l6 z: L' z }! a; l$ H; o* J1 v0 f if(mask&0X02)buf++; //去掉负号: `1 s: E( W& l1 [' h for(i=0;i<ilen;i++) //得到整数部分数据 { ( Y& \8 ^6 B% n* K3 _7 o ires+=NMEA_Pow(10,ilen-1-i)*(buf-'0'); } u% z9 o' a( m; @: {9 a/ G if(flen>5)flen=5; //最多取5位小数4 Y2 J |% z6 j6 f- M *dx=flen; //小数点位数 for(i=0;i<flen;i++) //得到小数部分数据; q2 Z& _* W9 N( z4 t! S { 0 F: X, ]- f9 M1 n9 Z8 |! |" H fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0');& w4 [) W, ^% z+ i: e# U1 I } d' N! P% a+ \3 _% L res=ires*NMEA_Pow(10,flen)+fres; if(mask&0X02)res=-res; return res;) j1 N8 ~0 C2 j8 S& L } 效果:字符串:”123.456” 先转为 123456,然后除以1000得到123.456 ' Z5 s( @& `7 S2 p- J0 }4、十进制转字符串 代码实现: 如果只是单个十进制转字符串,使用sprintf函数就可以了。 如果是十进制数组: ; a/ [' {5 \9 c( f! W" R u16 DectoStr (u8 *pSrc, u16 SrcLen, u8 *pObj){ u16 i=0; ; M, E% P9 q" ~. }& Q& |& I; ? for(i=0; i<SrcLen; i++)8 A! A' ^3 O; [0 m { sprintf((char *)(pObj + i * 2), "%02d", *(pSrc + i)); }* p* J% E' P; P *(pObj + i * 2) = '\0';2 S+ u9 |% E0 S* @0 G return (i * 2);* t) V. H: q" U }3 J/ K2 E. k5 g, C% R 效果:十进制数组13 14转为字符串“1314” 5、u8、u32转换 5 r0 N; s) e: I3 W 举个栗子:ASCII码里 3 n' a/ R t: a; g 这里写图片描述 字符‘A’ , 一个字节8bit ,即u8 十六进制为 0x41 二进制为 0100 0001 $ S5 l" C( J9 i( p' g1 M) D3 B9 ~ 而对应的十进制为 65 整型65,4个字节32bit,即u32 十六进制为 0x41 二进制为 0000 0000 0000 0000 0000 0000 0100 0001 将u32数转换成u8数组 + q; y& Y3 b/ |8 S) `" \ 注意:这里是字符数组,不是字符串 字符串是以空字符(\0)结尾的char数组 ) M- g1 F) S- \+ N% G) i% a9 m4 ` void U32ToU8Array(uint8_t *buf, uint32_t u32Value){buf[0] = ((u32Value >> 24) & 0xFF); buf[1] = ((u32Value >> 16) & 0xFF);# P9 K& A7 x, Q; X) y& D# ?5 J buf[2] = ((u32Value >> 8) & 0xFF); buf[3] = (u32Value & 0xFF);+ A t( L1 v+ n6 Q9 r' R }$ x+ \* U' ]' I4 A0 T 效果:整型 50 转字符数组 {‘\0’,’\0’,’\0’,’2’} `% H4 N6 v3 P, C u8数组转u32 $ D% i5 G6 { V( W void U8ArrayToU32(uint8_t *buf, uint32_t *u32Value): W: z% y) u4 y1 Q6 V% W{ *u32Value = (buf[0] <<24) + (buf[1] <<16) + (buf[2] <<8) + (buf[3] <<0);/ h+ D0 ^/ i# h' \7 q5 }, i# ^) F } % {# S( O# H$ j! N% R9 m 效果:字符数组 {‘\0’,’\0’,’\0’,’2’}转为整型 50 6、大端小端 最后就是大小端问题了。STM32 默认是小端模式的,那么该如何转为大端? 1、转为大端 / d( L, g: z# F1 A" C 为大端:pPack[0] = (u8)((len >> 8) & 0xFF);, k' Y5 Z8 Y- D! h" S pPack[1] = (u8)(len & 0xFF); / P7 V( G7 _1 ?, X9 v0 T+ w 为小端: pPack[0] = (u8)(len & 0xFF);5 A- }# V* h2 i4 Z, y2 d1 g4 e; ` pPack[1] = (u8)((len >> 8) & 0xFF); / \3 E5 Z. D7 E" k O 效果:len为数据类型为 u16(short),比如 0x11 0x22,转为u8(usigned char)数组。 大端为: % Q; j' y7 V" g+ H& p6 |! ` pPack[0] (0x11 ) pPack[1] (0x22) 2 ]" G4 l/ k/ B7 | 小端为: % ]; |8 ]3 A, s pPack[0] (0x22) * D# Q* k; w; f5 \, t. BpPack[1] (0x11) |
微信公众号
手机版