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

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

[复制链接]
gaosmile 发布时间:2020-8-9 21:31
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* {* |
{
9 n2 U$ C6 A' C/ g; q' f1 W  char h1,h2;  C5 i* V6 p: _- ^
  char s1,s2;
. P6 M5 ]  m' p, K  int i;
5 m+ s) ^4 w! o; B
' N* ~. D; u0 x" V3 k3 F    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

4 A/ a: X( N  G) o% X, g9 ~        s1 = toupper(h1) - 0x30; //toupper 转换为大写字母: g6 P3 ~- s  H
        if (s1 > 9)# x: `$ M$ Q( n
            s1 -= 7;
) E, L3 l6 j" _# z1 T- u/ r        s2 = toupper(h2) - 0x30;
! V6 q: }; @9 L3 |8 \  ^        if (s2 > 9)
0 o! x; W5 K3 Z" D5 ?. U0 o: r            s2 -= 7;9 B2 |5 G. a/ P3 P

. d9 i6 Z; K' x; c        pbDest = s1*16 + s2;- v" u% ^' j9 \$ d# {& w# L
    }, E; o; Q& q* c( y. M( u7 M- j
}

4 [7 O/ o7 e+ f( ?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++)
) k9 `. W# p; a+ z    {) V+ N3 a. X1 c6 H8 F  N; N
        ddh = 48 + pbSrc / 16;
6 j" ?- E/ F% D2 z/ k9 V        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;
- |& a8 M2 b# j, w8 p) g! n2 f# z4 X        pszDest[i * 2] = ddh;
8 D; T9 {. h2 W$ T        pszDest[i * 2 + 1] = ddl;
7 r; l- V" y' h/ H$ P# D) w! i    }* 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)
, B$ r' g3 w1 E! ^, r{- G2 l+ [" y$ n0 H; i. E6 D" j
    u16 i=0;
( d: B# i* a/ B+ l5 c' 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));
& U7 w' |9 y% }9 D8 W4 T; ^1 C    }
4 o& H4 n* P1 y: H! t# P0 K    *(pObj + i * 2) = '\0';5 V7 _  I9 r5 m$ e, n
    return  (i * 2);
4 ^* N" k5 M, S( J2 l+ f8 f}
) e% }( }! L% D- r& r# @7 h+ T

* K. u/ M8 J/ [0 z4 q
效果:十六进制:0x13 0xAA 0x02转为字符串:”13AAA2”

+ k" e  Q6 t9 o
3、字符串转十进制
代码实现:

8 S0 q4 ^* k6 u; S% D
第一种,如果带负号 这个就是atoi函数的实现:

, g) \* Z$ h, s$ q% \$ Q7 w
int my_atoi(const char *str)
' s2 T8 _- X7 T7 \/ K{
' x" @9 [: g3 ~3 w4 {8 H    int value = 0;
3 o1 s$ ~; M$ E    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++;
- J' c9 R( Q1 O' [    }
) M$ k! u) K' C# K* t. }( y    if (*str == '-')  //第一个字符若是‘-’,说明可能是负数
( a- e6 i$ A+ |- R    {. q" Q* g" Y$ p! R5 J# N
        flag = 0;
, e/ D- {4 _" w        str++;
& T$ V& y# I8 W9 b5 B) [' G" [    }  P" U, h+ p; V
    else if (*str == '+') //第一个字符若是‘+’,说明可能是正数$ {  [, D1 \/ z0 U' R' l
    {3 b. x2 k% R, c
        flag = 1;
; ^( W0 F/ K9 x8 E- ]        str++;. I. G+ h6 N4 N9 t3 o/ y6 J4 b
    }//第一个字符若不是‘+’‘-’也不是数字字符,直接返回0
6 R1 L; `* j) q( p/ t    else if (*str >= '9' || *str <= '0') ( E* @; O0 N' r
    {
) C6 D  m( d; b7 H0 g( r        return 0;   
8 f+ R/ S6 {% t+ F7 ]) m5 l4 `    }% 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')
; O$ ?5 e% _- W: L' \' n# X' k    {
* v0 @1 u8 F6 W) w) z9 L' C        value = value * 10 + *str - '0'; //将数字字符转为对应的整形数
/ ^( u6 E. g+ E        str++;' F) O( r5 \  o/ N' ~) y
    }( W5 }' ~4 \2 z: ?4 A0 I' V1 d
    if (flag == 0) //负数的情况
/ G. b: N4 {& o7 T    {. S1 }; h4 N) W
        value = -value;
2 X% G! O, c% x/ I$ a: |: Y( K    }6 v+ Q8 e: |- L9 [' ~
    return value;
, W8 y& e+ z. `: r}
& 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
第二种,如果不带负号:

: L9 X6 N2 i5 Z* j. `; m4 d9 ^& b
void StrtoDec(uint32_t *pbDest, char *pbSrc, int nLen)
2 L9 ~5 _. ~' F9 `6 A{; }9 G" N8 h* x# }: K8 n
    int i;
1 ]5 u5 a( v  g1 J. g$ n* M    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
    {
9 M( J& p& n$ {$ P. ]# g        *pbDest += tmp*(*(pbSrc+i)-'0');
$ I  U/ }  e$ S1 P2 C4 _: P4 q        tmp = tmp*10;
6 ]6 i, F, V6 X" c: D# }    }
7 h; k) `: D. h  k1 `2 X! i}

9 h6 r, N; {6 K
$ I, W/ {* x; C5 A* P( F! Z
效果:字符串:”123” 转为 123

6 a1 x% x0 m4 j* S
第三种:包含转为浮点数:

+ T! v) f2 u6 {8 K! W& v/ t$ C
//m^n函数
6 H6 @+ \; ~, o. p; q//返回值: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' \
{
/ C$ g9 O6 P2 C    u32 result=1;    * h$ q* v( V( A, b  x
    while(n--)result*=m;   
- `; Z% s( |- J- a; y! w- u    return result;
. A6 \% p" n8 n' u}
8 c! {: h$ [& \+ P. B//str转换为数字,以','或者'*'结束6 L7 G! X6 B$ c- t4 I
//buf:数字存储区
9 I' n) _" n0 z# q//dx:小数点位数,返回给调用函数
# H, B, h# V$ X' W1 _( A//返回值:转换后的数值
6 U# G$ U; c$ [int NMEA_Str2num(u8 *buf,u8*dx)
) g/ M+ n6 T3 m  I; Q* L7 X3 t" F) s0 m{, C2 i) [) p  f1 K  `, Y
    u8 *p=buf;
5 f& g0 a- j. d3 p    u32 ires=0,fres=0;7 d4 S$ W% Z# |- u$ h: Z
    u8 ilen=0,flen=0,i;
- g$ C& v2 s$ }9 [1 D    u8 mask=0;
1 D* q1 L/ z/ F4 m) ]    int res;
7 h# F+ |5 l9 R9 X( c* y2 g% K1 k    while(1) //得到整数和小数的长度1 L+ q9 K1 S  c! ~! e/ _, _  c
    {
2 {: F7 |$ P" S) e        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'))   //有非法字符
+ N- {# z% u* H# D  B% Q1 q% q$ \        {   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;
+ n( V. X$ t  J, V+ F/ p: V        }   9 o1 b: \3 e) U% L) r
        if(mask&0X01)flen++;
$ k; C2 k6 R* \0 [7 L* W        else ilen++;% j5 n4 C2 ~2 Z+ ~& L
        p++;
' U: O) P  K: m8 X8 Q) `    }
  s+ y% p! F/ h1 B+ E! e    if(mask&0X02)buf++; //去掉负号
0 R* r9 a! e5 g; J    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
    {  
5 Z, k9 F+ V1 r8 |- l& g+ M7 O        fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0');/ t( m# d% b2 y  p& m
    }
: z: A" y# e7 u% T( T    res=ires*NMEA_Pow(10,flen)+fres;
! X. |; T" @6 h- E    if(mask&0X02)res=-res;         
- n( `. ]8 s  h# H# T6 d* y4 I    return res;
, `9 R* {! u1 k1 {}

4 k- `! p  V4 i$ B6 @" M( f) m  ^
7 L' ^! }# E6 g( J3 P9 I) I
效果:字符串:”123.456” 先转为 123456,然后除以1000得到123.456
- X% n' f% n9 ]' H9 e  d5 {4 h
4、十进制转字符串
' t* B* ?4 s: a' A+ O7 g
代码实现:
9 ^9 v% j! w. V0 w- ]
如果只是单个十进制转字符串,使用sprintf函数就可以了。

* r  R$ N+ u+ _6 P" e
如果是十进制数组:
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
{
* s" @0 S, v, I3 T1 |% J9 |    u16 i=0;
, m  Z& b1 `' Q
. `6 z/ A4 C: Q; J  ^6 P/ T    for(i=0;    i<SrcLen;   i++)
! `" Q& Z0 n" K  i7 a3 x    {
% u& d. M: u0 u0 \, g: U2 a) E        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';
2 x& W7 n3 ~5 U! e    return  (i * 2);
4 D6 R* B* `. T, X}

; ]* x* |2 A- s6 s& |. S

1 S; R- z4 k$ |. B& R$ w) d
效果:十进制数组13 14转为字符串“1314”
1 ]9 \7 ?( u/ l$ P8 S# E* j! r
5、u8、u32转换

: ^' A- {# v2 o, N/ {/ [0 f( A
举个栗子:ASCII码里

8 o  X: O6 ?: p* A
+ ~" s9 V0 v6 x' q
这里写图片描述 字符‘A’ , 一个字节8bit ,即u8 十六进制为 0x41 二进制为 0100 0001

/ w! ?0 r9 T+ S9 p
而对应的十进制为 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 O; Z: W$ E0 T6 l
字符串是以空字符(\0)结尾的char数组

$ ], d% K' |7 Q. K3 h2 J$ s
void U32ToU8Array(uint8_t *buf, uint32_t u32Value){0 A7 g8 n" D# e# P3 x; L" L6 Q
    buf[0] = ((u32Value >> 24) & 0xFF);
0 J+ \. @2 I" r* J2 ?% [3 f    buf[1] = ((u32Value >> 16) & 0xFF);
! _8 j: ~# Z+ j; A' \! T) ^0 o7 d    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

$ d% A" n( m5 M9 \3 P
效果:整型 50 转字符数组 {‘\0’,’\0’,’\0’,’2’}
0 J7 z5 C3 p+ P
u8数组转u32

$ y: t: X/ ~8 K! B& U5 E
void U8ArrayToU32(uint8_t *buf, uint32_t *u32Value)
; H4 I2 b1 a. H' v0 Z+ i7 N{
2 V+ \: n3 h) Y. d    *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  t
6、大端小端

2 x& _# P- x( U4 A9 p3 z% m+ C
最后就是大小端问题了。STM32 默认是小端模式的,那么该如何转为大端?
' X- o& I9 B4 W, a; }% T. b
1、转为大端
1 w( G" d0 L9 e6 w
为大端:3 {; }+ O/ U) I0 w9 M1 H; p
pPack[0] = (u8)((len >> 8) & 0xFF);) O7 ~" ], R( K- @% T. o; m
pPack[1] = (u8)(len & 0xFF);! @, n/ @* U- @# A; C

  t6 Z0 C& e2 s9 q/ v, S2 ^5 G为小端:
2 s) c( j) x" D. ^8 \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
大端为:

2 o( A2 R* I' h
pPack[0] (0x11 )
3 _0 {% {) p4 s- ^+ r1 _9 r- DpPack[1] (0x22)

# V5 s# O6 A& ]3 l  O- l
  e3 w/ b7 J3 V
小端为:
& S1 _5 v5 ^2 x& e0 w% \$ g$ [
pPack[0] (0x22)
, q, p9 {9 C( t" {" ^( N  Q" hpPack[1] (0x11)

& g; r- H8 n# o2 J/ j$ q
赞 收藏 3 评论0 发布时间:2020-8-9 21:31

举报

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