|
1、字符串转十六进制 % d& v! b3 a$ S! U- {9 k, r" O 代码实现: / v9 [# |1 D& P' H- K/ x! @" A) ~ void StrToHex(char *pbDest, char *pbSrc, int nLen) s1 \& Z$ F& g% ^5 N" O' F, j{ char h1,h2;6 ^7 a3 w( g$ @$ h char s1,s2;+ C/ e5 ]1 M4 ?. `* |; n int i;$ K E; m6 O; h: i& i for (i=0; i<nLen/2; i++) { h1 = pbSrc[2*i];0 [& \6 S0 h1 u* i1 U( Q h2 = pbSrc[2*i+1]; * G4 k/ ^0 q0 ]) y' B2 N5 a s1 = toupper(h1) - 0x30; //toupper 转换为大写字母, l$ |) x1 J& j7 z. I( L4 V if (s1 > 9) s1 -= 7;! h0 ?5 k {, V5 z s2 = toupper(h2) - 0x30; if (s2 > 9)2 ?7 x' Y" C: Y: P$ w s2 -= 7; pbDest = s1*16 + s2; }( Q* D* y4 G# ]# g2 A p4 W' k } 2、十六进制转字符串 , n! C5 ?! C1 Y/ H' t ^ 代码实现: {6 W3 k6 y% q- C6 T- [, I. }3 J0 { char ddl, ddh;- i, g. B4 s2 `8 M for (int i = 0; i < nLen; i++)0 H" a, D) ~8 D& z3 ~# T( E { ddh = 48 + pbSrc / 16; ddl = 48 + pbSrc % 16;; t3 H" ^# E7 }6 y if (ddh > 57) ddh = ddh + 7; if (ddl > 57) ddl = ddl + 7;- m3 T* f3 P! ?0 M4 j4 h2 U$ H/ z- u pszDest[i * 2] = ddh; pszDest[i * 2 + 1] = ddl;5 h# h, w9 K! N& _: P0 R/ p }% D8 V- V' a8 A0 N. H pszDest[nLen * 2] = '\0';5 M% b7 j2 }! |9 |+ p1 v } 或者 u16 Hex2StringArray (u8 *pSrc, u16 SrcLen, u8 *pObj){" x( Q8 r8 L# D3 X5 J' o u16 i=0; + D3 A3 F3 N6 P for(i=0; i<SrcLen; i++) { sprintf((char *)(pObj + i * 2), "%02X", *(pSrc + i)); } *(pObj + i * 2) = '\0';" o( o+ a3 b# [: J' [" f return (i * 2); } & v' J+ R5 m. `+ f, H2 c 效果:十六进制:0x13 0xAA 0x02转为字符串:”13AAA2” ! T3 Y3 i; x4 L1 v" q 代码实现: 第一种,如果带负号 这个就是atoi函数的实现: int my_atoi(const char *str){ I# G# ?* `5 { int value = 0;0 N; J F: }' T6 H+ j f int flag = 1; //判断符号7 {1 U2 Y _+ x* x& U! V while (*str == ' ') //跳过字符串前面的空格6 C! G! p. h* Y, I1 H0 ? { str++; z- F! _ [" i0 ^ }+ _1 [) \6 `! S, Y( \$ c: ] if (*str == '-') //第一个字符若是‘-’,说明可能是负数 {" L1 z9 j6 `- R0 e flag = 0;6 H6 N" T4 r, O/ z( \' d) m1 _ str++;! }- e& f' Y4 [- t* p) D } else if (*str == '+') //第一个字符若是‘+’,说明可能是正数 {! Y. w1 r+ S5 N+ V( ]' p9 V flag = 1; str++; }//第一个字符若不是‘+’‘-’也不是数字字符,直接返回04 n+ ?7 x! s( q7 o" q else if (*str >= '9' || *str <= '0') { return 0; : _! Y. P i4 S } //当遇到非数字字符或遇到‘\0’时,结束转化( P/ l$ O! W3 U- o0 j* } while (*str != '\0' && *str <= '9' && *str >= '0')7 m4 Q/ N6 U' C( D6 ]- F) G {( V$ b8 d8 n( w- j* T6 a value = value * 10 + *str - '0'; //将数字字符转为对应的整形数( j- h) p- B2 G! G str++;. n' ^) q/ ?1 i8 M* G }$ V7 K1 [8 G, }- k if (flag == 0) //负数的情况3 q% g5 W, d' \, C. s9 Z1 u; S { value = -value; }. ]: T5 j7 i0 a! U3 A return value;/ N; Q" k1 S5 n# P& ? } 效果:字符串:”-123” 转为 -123 . b5 \. i6 t& R! V: t 第二种,如果不带负号: {& S5 l, R$ X; J9 w/ V# B5 y int i;) i) v: P# U- }8 S int tmp=0; if(nLen > 10)) X/ @; R, i: E5 \0 c *pbDest = 0;' K$ }& ?7 ^: q5 r3 j/ V tmp = 1;* d( _4 t* L! A5 ^7 V *pbDest = 0;) I" L+ N1 g* t T% u" B/ W3 l for (i=nLen-1; i>=0; i--) {0 h. d$ H, _' a1 ?( l7 Q/ |+ ^2 C' O *pbDest += tmp*(*(pbSrc+i)-'0'); tmp = tmp*10;/ V" i4 `+ J+ ]3 b- P _- q }' y0 {4 H0 n; O+ C ]3 o1 ~$ l }# _& F% J: e& O8 P. Z' H 效果:字符串:”123” 转为 123 第三种:包含转为浮点数: //返回值:m^n次方.4 j) @4 |8 R- y5 N u32 NMEA_Pow(u8 m,u8 n) {4 y8 g& \2 @1 x u32 result=1; while(n--)result*=m; 9 r8 `8 P/ n7 R/ G" ? return result; }& ^( ?' E% m; { //str转换为数字,以','或者'*'结束 //buf:数字存储区 K* K/ y5 |+ `) y7 o, B6 G/ @ //dx:小数点位数,返回给调用函数6 l7 ?" X2 ^8 i6 P //返回值:转换后的数值* o+ _) x6 r- R9 d int NMEA_Str2num(u8 *buf,u8*dx) { u8 *p=buf;; P4 ]" H7 J% T u32 ires=0,fres=0;- N' L9 Z E! i) \+ F U u8 ilen=0,flen=0,i; u8 mask=0; int res; while(1) //得到整数和小数的长度4 |( Z: W8 `$ d { if(*p=='-'){mask|=0X02;p++;}//是负数 if(*p==','||(*p=='*'))break;//遇到结束了 if(*p=='.'){mask|=0X01;p++;}//遇到小数点了 else if(*p>'9'||(*p<'0')) //有非法字符8 k/ W) G+ _) b# p) M- V7 l { ilen=0; flen=0; break; } if(mask&0X01)flen++; else ilen++; p++;8 ]: L% t+ _6 T3 g% D! J) R } if(mask&0X02)buf++; //去掉负号 for(i=0;i<ilen;i++) //得到整数部分数据8 o! [6 x# g+ l/ O. \/ l { 3 a7 H- P1 k1 v; w+ r) O$ Q ires+=NMEA_Pow(10,ilen-1-i)*(buf-'0'); } if(flen>5)flen=5; //最多取5位小数9 [5 K. U8 ?, s6 ~ *dx=flen; //小数点位数 for(i=0;i<flen;i++) //得到小数部分数据9 _1 X: |& E' D- }% e { 8 `/ x# c; K" V fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0'); } res=ires*NMEA_Pow(10,flen)+fres;7 I1 Y& a: |7 L6 D* D0 n0 R0 ? if(mask&0X02)res=-res; return res; } ) r& t5 C* G( s( B1 J 效果:字符串:”123.456” 先转为 123456,然后除以1000得到123.456 4、十进制转字符串 代码实现: 如果只是单个十进制转字符串,使用sprintf函数就可以了。 . Q9 ?. g0 T/ F- d 如果是十进制数组: { u16 i=0;9 S; Z0 E0 y& W d for(i=0; i<SrcLen; i++) {+ \+ o! ?* u4 g3 H3 H+ x! y+ }( q sprintf((char *)(pObj + i * 2), "%02d", *(pSrc + i));5 a* v- v3 O' q }% } V4 V$ c+ q/ A; F! d8 d6 Q0 r *(pObj + i * 2) = '\0'; return (i * 2); } 效果:十进制数组13 14转为字符串“1314” 5 i- B7 V2 b! V5、u8、u32转换 举个栗子:ASCII码里
; ^6 X h' n1 ^5 T' J/ w 这里写图片描述 字符‘A’ , 一个字节8bit ,即u8 十六进制为 0x41 二进制为 0100 0001 而对应的十进制为 65 整型65,4个字节32bit,即u32 十六进制为 0x41 二进制为 0000 0000 0000 0000 0000 0000 0100 0001 将u32数转换成u8数组 注意:这里是字符数组,不是字符串 2 Z! I' S" S, q6 I6 s. n 字符串是以空字符(\0)结尾的char数组 & [* |- T) ?( _4 m% a- { void U32ToU8Array(uint8_t *buf, uint32_t u32Value){buf[0] = ((u32Value >> 24) & 0xFF); buf[1] = ((u32Value >> 16) & 0xFF);! v& M8 Q- l) f7 j) i! U3 p buf[2] = ((u32Value >> 8) & 0xFF); buf[3] = (u32Value & 0xFF); } % F% q& j7 |/ x6 k" n; z; Z/ W 效果:整型 50 转字符数组 {‘\0’,’\0’,’\0’,’2’} u8数组转u32 ( ], `$ `3 E- n3 i void U8ArrayToU32(uint8_t *buf, uint32_t *u32Value)" j" B/ i. M+ E/ D2 x& {3 v) k! R{. }1 r5 M# @ y& I m$ N *u32Value = (buf[0] <<24) + (buf[1] <<16) + (buf[2] <<8) + (buf[3] <<0);9 W9 ?- ?% z( L: W } # O: X# N: a4 J& t3 A1 s) T; W 效果:字符数组 {‘\0’,’\0’,’\0’,’2’}转为整型 50 6、大端小端 最后就是大小端问题了。STM32 默认是小端模式的,那么该如何转为大端? 1、转为大端 pPack[0] = (u8)((len >> 8) & 0xFF);, k6 }5 F# E, O5 A1 u: O6 D2 T pPack[1] = (u8)(len & 0xFF);. w* Y% K( X S: c7 x" L 为小端: pPack[0] = (u8)(len & 0xFF);$ B% U p/ \2 V3 v pPack[1] = (u8)((len >> 8) & 0xFF); 效果:len为数据类型为 u16(short),比如 0x11 0x22,转为u8(usigned char)数组。 大端为: pPack[1] (0x22) 7 G3 u* r `5 @3 ^! t% M# i 小端为: , Z( _1 z! z9 G& c- Q" s5 @$ } pPack[0] (0x22) ' p ~7 p* F" }; S, opPack[1] (0x11)' g8 ?; w2 @- W2 H6 w: n |
微信公众号
手机版