你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C语言一些常用的转换工具函数

[复制链接]
gaosmile 发布时间:2020-10-23 18:34
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
{
& Y% W5 J$ P6 h/ U  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

, d7 K2 u1 I6 v$ a/ U    for (i=0; i<nLen/2; i++)
7 s2 ~% @) d5 [; E; c) I/ g9 z    {
) H' @6 T7 R2 w- h! o5 x$ p        h1 = pbSrc[2*i];0 [& \6 S0 h1 u* i1 U( Q
        h2 = pbSrc[2*i+1];
; s( Y) j: {) t/ ]; `7 l* G4 k/ ^0 q0 ]) y' B2 N5 a
        s1 = toupper(h1) - 0x30; //toupper 转换为大写字母, l$ |) x1 J& j7 z. I( L4 V
        if (s1 > 9)
9 f! o  p( O. r8 e            s1 -= 7;! h0 ?5 k  {, V5 z
        s2 = toupper(h2) - 0x30;
  `; h* V( F' R0 U        if (s2 > 9)2 ?7 x' Y" C: Y: P$ w
            s2 -= 7;
- U7 i( k. g% V9 z. S4 y& M
4 r" Y* \  ~& L1 x0 Q        pbDest = s1*16 + s2;
8 F( T# j7 S: n. z. |0 L2 }    }( Q* D* y4 G# ]# g2 A  p4 W' k
}
/ j% Y- \# g+ V% u* o/ y  {( S

) p3 H* Q" E5 O- p4 @2 c
2、十六进制转字符串
, n! C5 ?! C1 Y/ H' t  ^
代码实现:

% Y% _5 C) ]( n8 B  M9 l$ u
void HexToStr(char *pszDest, char *pbSrc, int nLen)
; G3 j1 A" _+ t( L{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
    {
2 j5 h1 X3 T$ \+ w        ddh = 48 + pbSrc / 16;
7 }+ h+ D- A9 F$ X        ddl = 48 + pbSrc % 16;; t3 H" ^# E7 }6 y
        if (ddh > 57) ddh = ddh + 7;
/ Q+ q+ X- Q2 d) i/ w        if (ddl > 57) ddl = ddl + 7;- m3 T* f3 P! ?0 M4 j4 h2 U$ H/ z- u
        pszDest[i * 2] = ddh;
' ]: x$ z# b' Z$ @8 i9 Y) {2 U+ x        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
}
' N- `( ?6 I5 S: H% q+ X

或者

u16 Hex2StringArray (u8 *pSrc,  u16 SrcLen, u8 *pObj)
" b: F" o1 j- g0 \' z8 o! e- Q{" x( Q8 r8 L# D3 X5 J' o
    u16 i=0;
8 E" q) g1 C( I; ~$ ?2 h7 K+ D3 A3 F3 N6 P
    for(i=0;    i<SrcLen;   i++)
) C  g) o4 Q8 C    {
4 `! j, }. m2 f        sprintf((char *)(pObj + i * 2), "%02X", *(pSrc + i));
& Y; I- w, s" l5 I2 |' c    }
- Z) P" _* H6 D: o8 w6 Q. m) [3 B    *(pObj + i * 2) = '\0';" o( o+ a3 b# [: J' [" f
    return  (i * 2);
) x, h3 q" r# q! @% E}
6 B; h7 I" Y: I
& v' J+ R5 m. `+ f, H2 c
效果:十六进制:0x13 0xAA 0x02转为字符串:”13AAA2”

$ ?( r) ]" D# {, R- G3 F1 @
3、字符串转十进制
! T3 Y3 i; x4 L1 v" q
代码实现:

& L' v) x3 Y  U4 G4 l
第一种,如果带负号 这个就是atoi函数的实现:
int my_atoi(const char *str)
0 ~* p' [4 T8 ?. B( c9 L& m{  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 ?
    {
0 \0 F  u6 A; O; I! H        str++;  z- F! _  [" i0 ^
    }+ _1 [) \6 `! S, Y( \$ c: ]
    if (*str == '-')  //第一个字符若是‘-’,说明可能是负数
# A) \% D* j2 E% M, E: U    {" L1 z9 j6 `- R0 e
        flag = 0;6 H6 N" T4 r, O/ z( \' d) m1 _
        str++;! }- e& f' Y4 [- t* p) D
    }
) o% [* l5 n1 @, S8 A7 q+ m    else if (*str == '+') //第一个字符若是‘+’,说明可能是正数
8 r& S7 j9 T% y( }& V" z2 z+ P    {! Y. w1 r+ S5 N+ V( ]' p9 V
        flag = 1;
! W7 ^4 P' \1 T' ^$ s3 B        str++;
8 y" ]' i5 `4 s5 _    }//第一个字符若不是‘+’‘-’也不是数字字符,直接返回04 n+ ?7 x! s( q7 o" q
    else if (*str >= '9' || *str <= '0')
1 Y! Y8 K, I0 R# [  D6 V    {
7 y8 W; ^$ X7 ]2 ^9 J2 |  w+ D        return 0;    : _! Y. P  i4 S
    }
6 j  Q# K  O1 V: s& Q# v1 f    //当遇到非数字字符或遇到‘\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
    {
, S" n2 E% m" e; N+ Q        value = -value;
3 e2 n  B7 {: C2 k" h    }. ]: T5 j7 i0 a! U3 A
    return value;/ N; Q" k1 S5 n# P& ?
}
效果:字符串:”-123” 转为 -123
. b5 \. i6 t& R! V: t
第二种,如果不带负号:

" v  C2 A5 R, u, P5 ]4 d
void StrtoDec(uint32_t *pbDest, char *pbSrc, int nLen)3 n3 Z' A( T+ F9 e; Z# f
{& S5 l, R$ X; J9 w/ V# B5 y
    int i;) i) v: P# U- }8 S
    int tmp=0;
. J6 \0 L' ]. `5 _( _8 B. j( z    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--)
. l5 M& e, y4 N& d, S8 D    {0 h. d$ H, _' a1 ?( l7 Q/ |+ ^2 C' O
        *pbDest += tmp*(*(pbSrc+i)-'0');
6 B5 E  W5 e9 K7 E- ~3 s        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

% K1 `8 M) [7 H# n6 H
效果:字符串:”123” 转为 123

$ }* b, L3 [* u
第三种:包含转为浮点数:

# [+ Q* \: s, |" N8 y% a
//m^n函数
4 f2 H" G1 m. ~  y5 q" t1 w" x//返回值:m^n次方.4 j) @4 |8 R- y5 N
u32 NMEA_Pow(u8 m,u8 n)
2 [/ J  d' r  W, G0 r9 Q2 ?{4 y8 g& \2 @1 x
    u32 result=1;   
% E; J5 ~- @8 r5 t4 F$ X" X    while(n--)result*=m;    9 r8 `8 P/ n7 R/ G" ?
    return result;
- P' s3 Q- p7 p! }  J4 O% B}& ^( ?' E% m; {
//str转换为数字,以','或者'*'结束
7 Z: r  r* ?: \' d4 P/ o* @//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)
% a0 U+ X) J" m- `* u{
) U2 n2 Z; d- k+ V7 Q    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;
' _  o' E0 h9 n, t: X" a9 \% g    u8 mask=0;
* k- B7 y3 ]- h( M    int res;
$ {+ \4 g$ H, G7 R; ^( @  C    while(1) //得到整数和小数的长度4 |( Z: W8 `$ d
    {
4 A- {- S! i$ h  u        if(*p=='-'){mask|=0X02;p++;}//是负数
7 a, f9 Y% W; ~0 F) y2 H        if(*p==','||(*p=='*'))break;//遇到结束了
+ Y/ q. s, d4 e. t# C' f' ^. X0 F        if(*p=='.'){mask|=0X01;p++;}//遇到小数点了
$ l; i2 K1 S5 z' n        else if(*p>'9'||(*p<'0'))   //有非法字符8 k/ W) G+ _) b# p) M- V7 l
        {   
6 X+ `+ O5 D7 ]6 ~1 s            ilen=0;
; X2 e! h9 x+ U) R+ K  g            flen=0;
+ s  p& Z: Z/ h/ K            break;
) r( g, ~9 Q  c3 q        }   
7 ]! I$ }* u% @/ i. k        if(mask&0X01)flen++;
6 s+ c( b* H( H0 B  W2 j        else ilen++;
& \) h# g/ H& i0 U4 N; G        p++;8 ]: L% t+ _6 T3 g% D! J) R
    }
- P# K; {0 G! z% L* U9 Q    if(mask&0X02)buf++; //去掉负号
8 a" Z% l$ t  i/ N8 ?: ]5 H    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');
$ z/ ~" G7 Z( U2 C* D" U- j    }
/ i" Y' M, T! F. l    if(flen>5)flen=5;   //最多取5位小数9 [5 K. U8 ?, s6 ~
    *dx=flen;           //小数点位数
1 c/ r8 |% I! f1 W    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');
+ t( {; a: }+ y7 X    }
: \* m% y3 {* M0 j0 s4 i) q" t$ D    res=ires*NMEA_Pow(10,flen)+fres;7 I1 Y& a: |7 L6 D* D0 n0 R0 ?
    if(mask&0X02)res=-res;         
% i6 @, i) W, u  @5 x    return res;
) d* f9 x6 X) S5 r} ) r& t5 C* G( s( B1 J

7 x- o5 f' a, N  x. n8 ^& ~" }% ^
效果:字符串:”123.456” 先转为 123456,然后除以1000得到123.456

$ _1 @1 I% G; Q  D% d
4、十进制转字符串

) R# }" {8 t% A1 N2 a2 g
代码实现:

' B" c0 q5 F. r" h, x
如果只是单个十进制转字符串,使用sprintf函数就可以了。
. Q9 ?. g0 T/ F- d
如果是十进制数组:

  a4 \) P9 a5 m5 a5 h/ C3 d
u16 DectoStr (u8 *pSrc, u16 SrcLen, u8 *pObj)
4 d/ G0 L/ u+ L{
. n" J# z& r2 G5 J" {8 c    u16 i=0;9 S; Z0 E0 y& W  d

! `- w4 I; H$ I! N7 D    for(i=0;    i<SrcLen;   i++)
. [) n  \8 K, B/ l" ^    {+ \+ 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';
* z7 U: C% d8 {% Z4 @    return  (i * 2);
! l( `$ ~) \: n! q}
$ x$ F) P" }# T* Q

/ B+ g1 L/ o6 ^- L' l2 i# B
效果:十进制数组13 14转为字符串“1314”
5 i- B7 V2 b! V
5、u8、u32转换

, i2 r. U, o% p8 B) D3 b; a
举个栗子:ASCII码里

: [; ^  d! p. ~7 C  g* E
微信图片_20201023183404.png
; ^6 X  h' n1 ^5 T' J/ w
这里写图片描述 字符‘A’ , 一个字节8bit ,即u8 十六进制为 0x41 二进制为 0100 0001

; U+ `% ?2 j# V- \
而对应的十进制为 65 整型65,4个字节32bit,即u32 十六进制为 0x41 二进制为 0000 0000 0000 0000 0000 0000 0100 0001

0 v# k" l3 G2 Z4 s! q
将u32数转换成u8数组

: F1 v! W. {4 g
注意:这里是字符数组,不是字符串
2 Z! I' S" S, q6 I6 s. n
字符串是以空字符(\0)结尾的char数组
& [* |- T) ?( _4 m% a- {
void U32ToU8Array(uint8_t *buf, uint32_t u32Value){
2 w  |3 Y, J* W" e' ~    buf[0] = ((u32Value >> 24) & 0xFF);
1 E& Z% \) a0 b0 f7 j    buf[1] = ((u32Value >> 16) & 0xFF);! v& M8 Q- l) f7 j) i! U3 p
    buf[2] = ((u32Value >> 8) & 0xFF);
8 W( S) S: o" D& Y    buf[3] = (u32Value & 0xFF);
% X; X5 P' C( k: {. t}
3 }" }6 B; ^! a1 W" L
% F% q& j7 |/ x6 k" n; z; Z/ W
效果:整型 50 转字符数组 {‘\0’,’\0’,’\0’,’2’}

  }1 i+ ]6 M( ^1 K5 ]3 e
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
}
+ H+ X. p3 ^  A! n1 d
# O: X# N: a4 J& t3 A1 s) T; W
效果:字符数组 {‘\0’,’\0’,’\0’,’2’}转为整型 50

' E. t% h  U% I7 F0 h, R
6、大端小端

  a) {# @! n  I. h1 P0 O, w# Z
最后就是大小端问题了。STM32 默认是小端模式的,那么该如何转为大端?

/ E' J& ?/ ~' @# h4 b0 C
1、转为大端

/ b/ H1 T/ R" _/ u1 e* P
为大端:
7 _. O( g6 c+ O! @/ G/ ^' r9 w& G( A/ upPack[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

- g! F' C: |9 o6 [为小端:
* R5 `) ^* n0 i6 \$ I3 IpPack[0] = (u8)(len & 0xFF);$ B% U  p/ \2 V3 v
pPack[1] =  (u8)((len >> 8) & 0xFF);
) }0 y; j% L* p, G+ {9 L+ I. s$ D

& p' l% F6 U5 W) D! q$ V
效果:len为数据类型为 u16(short),比如 0x11 0x22,转为u8(usigned char)数组。

5 l6 [7 ~  s5 S
大端为:

% S; e: ]/ [4 I5 |$ y+ `5 E! n! w
pPack[0] (0x11 ) . O% O( t7 L$ C6 p2 ~; \
pPack[1] (0x22) 7 G3 u* r  `5 @3 ^! t% M# i

! i3 S- B5 h; o: D: k& Q* Q9 l% @
小端为:
, Z( _1 z! z9 G& c- Q" s5 @$ }
pPack[0] (0x22) ' p  ~7 p* F" }; S, o
pPack[1] (0x11)
' g8 ?; w2 @- W2 H6 w: n
赞 收藏 评论0 发布时间:2020-10-23 18:34

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版