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

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

[复制链接]
gaosmile 发布时间:2020-8-9 21:31
1、字符串转十六进制

' h7 ?7 S) Q% m
代码实现:

; y2 t: g$ P+ t! a' K1 M# O
void StrToHex(char *pbDest, char *pbSrc, int nLen)
  ^' J+ l7 Q6 i8 x{
' D8 u; h) O, m# L1 x( }- E" h% }  Z6 B  char h1,h2;1 ?+ ?# j: `$ C4 F/ p1 Y2 Y) o
  char s1,s2;
1 x0 `1 s0 ~) x3 p, I0 X; s1 \$ |  int i;
+ j" l7 K1 B, L! b) M/ u: `0 r
1 R" M5 ?( @  X" S" ~    for (i=0; i<nLen/2; i++)2 I( n! ~$ ^2 G% b% w) d
    {
) I! O! T( K' l1 Z; y0 W        h1 = pbSrc[2*i];: K; C/ P* l. g$ j$ f0 R
        h2 = pbSrc[2*i+1];
. v" U) z9 F! ]
# e, X2 y& o! ]- k- _        s1 = toupper(h1) - 0x30; //toupper 转换为大写字母) @$ G* f6 Q8 G, t
        if (s1 > 9): ~6 y3 s' m! H! s
            s1 -= 7;
+ }) r# b3 P" w9 H9 D; M; ~5 T0 h        s2 = toupper(h2) - 0x30;
: [+ t% b2 E2 q; R$ A        if (s2 > 9)
% f" R4 x5 x1 w( N0 r; Q: H            s2 -= 7;
: s: Y& H. _& C( g* 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
}

7 F" d* Z# I" \0 P1 E/ ~* _( y2 h$ b  l$ H- l! n" o
2、十六进制转字符串
代码实现:

/ Q$ p  N. M1 K6 e* v8 U1 H2 H
void HexToStr(char *pszDest, char *pbSrc, int nLen)8 {, n; e, A; n( s
{' K2 {( s  W& T+ l  A# W. f! f
    char    ddl, ddh;
8 Z2 U+ ]' Q5 v' g: u: Y    for (int i = 0; i < nLen; i++)
2 N( Q1 ~2 I3 l- g/ M# D* ]) c' f    {, \8 H; ?* M% c
        ddh = 48 + pbSrc / 16;
! {5 e+ O4 s3 g6 E6 w- U        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;
1 ^# _- u( X  t' l* w9 ]        pszDest[i * 2] = ddh;
" \1 j3 e4 t- ~9 M6 i9 V        pszDest[i * 2 + 1] = ddl;
1 R3 T  J7 P' s7 q5 W% X* R7 {' W    }  \6 r8 L; y5 g  P. w2 o; W: a
    pszDest[nLen * 2] = '\0';
/ |4 Y. W# R# O: d7 m}

4 D( m' u- f: ]5 j

或者

u16 Hex2StringArray (u8 *pSrc,  u16 SrcLen, u8 *pObj)
* Y) q+ F9 W, F# r{5 ]* @. h% ?! {# `2 m; _) q# s1 ?: x# Z
    u16 i=0;5 ]5 n# r( n" ?& w4 e7 }

1 f& T$ \" N4 ~2 y8 M+ r0 G5 ^    for(i=0;    i<SrcLen;   i++)2 P! E5 k: f. D. C
    {
7 z" D* y  }8 s$ A1 ~) K& G" B        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);
% \/ w/ l& ]& p$ O}

8 y9 E% }! a$ u( m

! d* u" N  y+ D3 ~* V/ ]# {9 Y- }
效果:十六进制: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
{
; q5 {' C7 Z7 y' |3 w/ h    int value = 0;! s" N" _- _, u* p9 h4 u' t' W- G
    int flag = 1; //判断符号
+ X. J. Q" z1 w& \5 l8 b! W    while (*str == ' ')  //跳过字符串前面的空格
. c/ [+ \  r( o, ]2 g4 Z+ w    {# Z+ d1 H' I  V8 v! _
        str++;
6 b3 b* A6 p6 S- \1 W4 j    }
9 T  @0 J  n; b( |    if (*str == '-')  //第一个字符若是‘-’,说明可能是负数! {7 Y" ?2 W2 a% c
    {
8 T( l  H% \/ |; P% }% [, r9 N6 r        flag = 0;
9 V% S, y7 |3 _/ T; q$ o        str++;, _% w) A9 R3 v6 P7 f4 s& E1 I: z
    }
3 b  R7 j* n" }' ]  x+ x2 i4 k. l    else if (*str == '+') //第一个字符若是‘+’,说明可能是正数& z8 R9 n6 H( g2 S7 ~
    {
" ], Q# g3 A) A# L        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')
9 h. N8 x* \+ Q5 @( h+ q; D    {( y( h: Z3 [  V% x3 n) L
        return 0;   
; g% g! a( A6 p/ j    }
  u  i4 J3 B! Q/ g    //当遇到非数字字符或遇到‘\0’时,结束转化
( G$ p- t+ |  u! k    while (*str != '\0' && *str <= '9' && *str >= '0')
* r* I: `' Q  W% {& k6 G    {
2 L6 \& V  Z. C        value = value * 10 + *str - '0'; //将数字字符转为对应的整形数
2 v. J% c; s( K) M% g        str++;
0 Z7 x9 `7 I8 s! u& G( ]) X- D5 c) e    }2 J  ?% H' @2 r& M( p; @% }
    if (flag == 0) //负数的情况% e$ V& i3 y4 U9 |, ^
    {
' E, p+ M9 Q3 d/ I% E5 c        value = -value;/ O1 _: A3 Z: C: r: ?+ l
    }- p5 r( H9 D! B
    return value;' J" Q+ l2 K0 ]# M
}

" R5 Z, y4 i: {! S

/ v$ o5 e6 S$ g4 C( @5 J( z
效果:字符串:”-123” 转为 -123

( k- Y& w! [! c3 @5 {
第二种,如果不带负号:

  O0 ~: J8 s9 _* I  ]- C) X
void StrtoDec(uint32_t *pbDest, char *pbSrc, int nLen)
: L- j4 b7 d# S/ f{
* L6 N" E; T  ?    int i;" X8 z1 v' m& L
    int tmp=0;
) h, D7 L% b% Z& l1 v    if(nLen > 10)
; f" Z, T! l- N+ J! `: B( D1 m        *pbDest = 0;
4 x- Y9 n2 Y2 J2 q4 U% P% Q% a5 t    tmp = 1;& @$ C9 e3 f' L. a
    *pbDest = 0;
/ f8 O! r4 u6 D4 s  |( i    for (i=nLen-1; i>=0; i--)
, U: p9 x. m1 P    {
. N3 @4 q8 R: U6 F' [3 r        *pbDest += tmp*(*(pbSrc+i)-'0');
. h, h1 `5 |& c5 q' W2 K- g        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

. @3 S1 ]& q1 B
效果:字符串:”123” 转为 123

) F2 L7 d; Z6 ]4 ^2 I
第三种:包含转为浮点数:

) w* q) z8 t) b
//m^n函数8 @. N5 [9 n" k  k. u
//返回值:m^n次方.
2 P* b$ k6 n: ]# t4 U9 r- q4 I+ d, Du32 NMEA_Pow(u8 m,u8 n)* F, D5 Z9 o7 E
{0 D  b7 N8 E7 o, `4 D
    u32 result=1;   
& ^) ^% i7 `( T3 @3 p    while(n--)result*=m;   
1 A6 \9 H. s& R9 g. `, X    return result;( s6 l- c0 j* W- o) X: l
}1 g0 O2 t- v8 e% n0 e# W
//str转换为数字,以','或者'*'结束
, S' n8 r& i1 o* K  }/ z  J( M//buf:数字存储区
) h6 J: }# A% Z! N2 Q; {* I//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
{
, s0 u: b8 d0 B; F, z" T; C) V. t' d    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;
: K2 F6 P1 P' v; y    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++;}//是负数
8 h  v2 _/ t7 |9 N+ M- M7 V0 T" L        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'))   //有非法字符
) R* B1 d7 r1 S  v. ]& ~8 {4 W  d        {   
3 F3 ?( _; E6 {' c            ilen=0;
9 j, ]* z) `$ z3 V' I            flen=0;1 C" H3 N5 `" g4 z8 q# w
            break;
% I+ T3 ^! F5 L* f7 R5 ~4 U' ~        }   
7 x3 A- e' U! m$ J5 |' k        if(mask&0X01)flen++;
& D" U# ]" x. x8 L1 i* A1 l        else ilen++;
  M' N: A/ @# Z% X1 [        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++) //得到整数部分数据
7 b  E3 D' H5 j& b    {  ( Y& \8 ^6 B% n* K3 _7 o
        ires+=NMEA_Pow(10,ilen-1-i)*(buf-'0');
; A8 T' L1 w; G$ h, q9 Y5 e    }  u% z9 o' a( m; @: {9 a/ G
    if(flen>5)flen=5;   //最多取5位小数4 Y2 J  |% z6 j6 f- M
    *dx=flen;           //小数点位数
3 G) H9 r# i! M    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;
! j9 `# F! }/ k! r! w7 w    if(mask&0X02)res=-res;         
$ q9 b9 q, L$ v# Z5 b    return res;) j1 N8 ~0 C2 j8 S& L
}

6 D  D+ x, j. s) T8 p

1 m1 Z1 u5 ]3 A( @$ e7 u, @3 j" J
效果:字符串:”123.456” 先转为 123456,然后除以1000得到123.456
' Z5 s( @& `7 S2 p- J0 }
4、十进制转字符串

, I& b3 C( B4 f/ ?, p
代码实现:

5 u1 I* i6 s0 q
如果只是单个十进制转字符串,使用sprintf函数就可以了。

1 U. k9 i! q; \$ i' l0 G4 a- V
如果是十进制数组:
; a/ [' {5 \9 c( f! W" R
u16 DectoStr (u8 *pSrc, u16 SrcLen, u8 *pObj)
! A- X% C( `8 @+ w+ O4 T9 }{
, ?! l( c$ b- l2 w    u16 i=0;
! ]: W, b7 C# y9 F; M, E% P9 q" ~. }& Q& |& I; ?
    for(i=0;    i<SrcLen;   i++)8 A! A' ^3 O; [0 m
    {
. I; _& G/ `) K* j8 b0 A, H- \        sprintf((char *)(pObj + i * 2), "%02d", *(pSrc + i));
; ~  V+ c4 l/ L& M! e  C2 A    }* 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

  ?' b" t" A  ?3 v: v; n" x% F' W
效果:十进制数组13 14转为字符串“1314”

  [' f5 |# {1 J  r+ ~1 s+ k. x/ o4 ?
5、u8、u32转换
5 r0 N; s) e: I3 W
举个栗子:ASCII码里

2 N5 u  W$ U" v
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

) L: T* v% c  ^0 n
将u32数转换成u8数组
+ q; y& Y3 b/ |8 S) `" \
注意:这里是字符数组,不是字符串

) k+ r, H; A6 G6 o; k0 I; f
字符串是以空字符(\0)结尾的char数组
) M- g1 F) S- \+ N% G) i% a9 m4 `
void U32ToU8Array(uint8_t *buf, uint32_t u32Value){
) V5 ?6 `  g% d. e2 h    buf[0] = ((u32Value >> 24) & 0xFF);
& F8 Z2 v( B8 N" N6 f1 Q. U& |    buf[1] = ((u32Value >> 16) & 0xFF);# P9 K& A7 x, Q; X) y& D# ?5 J
    buf[2] = ((u32Value >> 8) & 0xFF);
$ @! Z, ?# Q$ k  Z( N- U6 N    buf[3] = (u32Value & 0xFF);+ A  t( L1 v+ n6 Q9 r' R
}
$ x+ \* U' ]' I4 A0 T

5 D& R% a& b- }+ x
效果:整型 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
{
/ Z* K5 E- z, Q+ f$ p, M    *u32Value = (buf[0] <<24) + (buf[1] <<16) + (buf[2] <<8) + (buf[3] <<0);/ h+ D0 ^/ i# h' \7 q5 }, i# ^) F
}

2 A, O& k1 ^! [5 u1 K* O( Y) r
% {# S( O# H$ j! N% R9 m
效果:字符数组 {‘\0’,’\0’,’\0’,’2’}转为整型 50

: Y; v3 L& R) x+ r3 O
6、大端小端

! X. n9 U. E9 O2 }/ g; |
最后就是大小端问题了。STM32 默认是小端模式的,那么该如何转为大端?

, C$ t! b( p& }% t
1、转为大端
/ d( L, g: z# F1 A" C
为大端:
) S& L+ B+ K5 U" _1 WpPack[0] = (u8)((len >> 8) & 0xFF);, k' Y5 Z8 Y- D! h" S
pPack[1] = (u8)(len & 0xFF);
7 M7 ]/ L/ u% y2 g0 i( Z' w# W/ P7 V( G7 _1 ?, X9 v0 T+ w
为小端:
" N$ L& i+ K0 n" s: I# KpPack[0] = (u8)(len & 0xFF);5 A- }# V* h2 i4 Z, y2 d1 g4 e; `
pPack[1] =  (u8)((len >> 8) & 0xFF);

& x  u9 Q2 C+ M' m0 F8 w+ j6 d3 |
/ \3 E5 Z. D7 E" k  O
效果:len为数据类型为 u16(short),比如 0x11 0x22,转为u8(usigned char)数组。

$ N3 y2 \7 V, G6 g0 G( d
大端为:
% Q; j' y7 V" g+ H& p6 |! `
pPack[0] (0x11 )
! K; V. ?4 o% a0 o9 KpPack[1] (0x22)
2 ]" G4 l/ k/ B7 |

$ q" M: `$ `. i7 ~" \' P
小端为:
% ]; |8 ]3 A, s
pPack[0] (0x22) * D# Q* k; w; f5 \, t. B
pPack[1] (0x11)

2 Q7 |. o! z3 N; x
收藏 3 评论0 发布时间:2020-8-9 21:31

举报

0个回答

所属标签

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