找回密码
 注册
关于网站域名变更的通知
查看: 45|回复: 0
打印 上一主题 下一主题

C语言常用的几个工具函数详解

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2023-2-22 17:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
1、字符串转十六进制代码实现:
- P7 H; C% H1 l) A8 r$ k
- ~7 i* \2 V. K3 v$ D' L0 F
void StrToHex(char *pbDest, char *pbSrc, int nLen)$
; ]5 I7 X6 Y. E  B{* A" J  N  W' ]+ j
  char h1,h2;) N) s! Q3 }4 w
  char s1,s2;
$ h& K9 s+ _* N0 |  int i;,
4 h, ~9 z, K% }! \6 z

! T9 d! D; J, \5 V- s: N4 G6 i
    for (i=0; i<nLen/2; i++)% _. ^& i. ?, G& d7 L) E9 K
( N" t# F- c+ k; o9 e    {3 [  i0 b. h. t3 J. t
        h1 = pbSrc[2*i];
* R! ]( w% j; e/ d8 i' V        h2 = pbSrc[2*i+1];6 \3 K, {  L, j( M
: M/ F# b# l% K8 N
/ }: s9 t; F% y7 w6 o# E7 k- o        s1 = toupper(h1) - 0x30; //toupper 转换为大写字母
% }& P: f8 s9 B0 U! ?        if (s1 > 9), E4 G2 g8 ~6 ]4 G
            s1 -= 7;* ~) H5 z! U$ a- w5 _
! t) {: j4 u; p! `" D8 c        s2 = toupper(h2) - 0x30;$ w$ i7 p% e* z8 Q0 t0 T- l, w5 X* l0 {+ H5 q
        if (s2 > 9)4 x5 |0 `4 V, _0 }2 m( S2 \
; p( _+ y/ _0 W1 d2 U* R            s2 -= 7;" }! k' \# o+ q) X# d4 T
# i8 }' C5 G6 X! e9 T# I  E9 C, a/ b  J
        pbDest = s1*16 + s2;: J! e) ?; Z/ }$ H: O' g1 M
    }3 V: s+ ~3 h0 u2 P5 d$ ]0 v
  @, D  m9 `4 v% X. b* |; }! b}
3 G( ^: n- [: S
$ {7 d; V# l) c# _

2 p) L( S3 A" ?
( r4 T3 W+ l* P0 G: o6 X2 }9 j2、十六进制转字符串8 Y( u5 r4 {2 w* B, y; I: `; u1 A! ?4 z" Q% c, E
: c7 F) Y9 `( d7 s4 j; |6 T5 ~5 S3 G/ o; W: U( C
代码实现:# v3 }6 e1 Q  b0 F$ y2 b$ F! ~  w/ s/ O  w- p) V( C
( _- k7 [' p; `8 q  \+ l# w$ H% J7 t7 @$ a# b) L
0 Q4 _$ X; g% g. Z& F( f
7 H% g+ i: J, p5 O# ivoid HexToStr(char *pszDest, char *pbSrc, int nLen)
3 i7 g% z, W5 s) l* u' f3 b7 @* W% T{6 `7 K4 J/ L2 K4 ]/ i  j' Y9 [1 W0 d! l, j: l3 [0 W: y) C- Q
    char    ddl, ddh;6 ^; }2 L) q0 J$ P
    for (int i = 0; i < nLen; i++)
+ S- K' t1 C; ~0 c  d2 w( L: t1 ], y3 [% ^    {$ F# ~" s2 l" D! S. t, m: o( B; D; K' H/ ?
        ddh = 48 + pbSrc / 16;
0 q( F' j- o! F        ddl = 48 + pbSrc % 16;2 T4 ?0 t. m! p# y/ [7 P& ^& d. k! e5 ~- {. Y4 M8 e, N
        if (ddh > 57) ddh = ddh + 7;1 S' F. w2 K+ I! k$ S' R
        if (ddl > 57) ddl = ddl + 7;9 [: c) b3 y9 N( J/ {; a* E# A5 V1 {0 u- v, h1 V
        pszDest[i * 2] = ddh;
5 {& C. w& S) C& i* Q        pszDest[i * 2 + 1] = ddl;8 X0 }2 i: ~" h7 G' V) V9 }7 ?" _6 z$ r& P( G5 L8 P
    }4 c) P4 I/ ?6 j* X; Q
    pszDest[nLen * 2] = '\0';2 W$ l' e& G" m4 g, O' m
}
# ~4 H4 b9 Z5 o. r3 j$ B1 ?- ^) J; j
或者

8 r6 U& T  |" ]5 [4 Y2 Bu16 Hex2StringArray (u8 *pSrc,  u16 SrcLen, u8 *pObj)
) F3 a. A; b; ?3 H; N{$ W' N% |2 y9 J3 K4 _; ?8 G% c, ]8 `% |, [/ V
    u16 i=0;9 ^$ ~! d. M8 k7 {, {
$ [( S1 K$ a3 L0 p- Z! Q# E( i) [' h. E
    for(i=0;    i<SrcLen;   i++)
. b# a' L- `$ ^$ u2 U7 H, P5 V    {* ^4 T6 f0 l! `% J* U  i! K# G' u: I9 n9 `- }' d0 @- U' c
        sprintf((char *)(pObj + i * 2), "%02X", *(pSrc + i));! |( h# g0 u; \7 P: g/ o2 R: L7 o1 `5 S) U4 [9 U8 Y( D
    }6 k0 V! h1 i( A& H: L3 e! R% b/ b- o* m7 B/ B1 n1 I
    *(pObj + i * 2) = '\0';/ _8 ^3 U/ u6 h
    return  (i * 2);6 k3 d/ j: A1 A6 S8 G8 j
}8 s3 a+ }' R' P3 a! `4 ?+ O9 q5 W! i5 n2 Z3 J& {" i% h

& ~" n* N- l% R; w6 i
  u; l9 Y+ z% _5 r# q2 f: Q" L; k% W9 `/ D; N) m
效果:十六进制:0x13 0xAA 0x02转为字符串:”13AAA2”' n) z+ F/ y. g$ L' k( \
* d& y# g5 k9 f0 E, j8 E$ H( k5 @4 B! @, F! l( O* k! w
6 r. L' I  W, ]- }: X4 O
3、字符串转十进制$ a( x4 e. @1 |4 E- U0 o2 {% V5 u. F7 H# L! C; c/ T
3 ]7 [; h* I1 P. C& G3 P
代码实现:% j3 s  \5 o) L! |9 e
8 Z/ ~$ t9 p, U# P7 \" J
6 B/ H8 G! [" m0 M/ }' b/ G$ N
7 [% r) }. j6 H2 M' \
第一种,如果带负号 这个就是atoi函数的实现:
; _8 w3 R% l2 ]# T/ {1 u" {9 [8 B$ E7 a, ]& @6 l
; v# x0 {) Q# W6 W$ z: o% x
int my_atoi(const char *str)
% P! X, u( F& A+ g{6 t% |5 Z# V2 P+ J/ z# C& }+ i
( Y4 a% f7 {8 s+ Q/ C5 s    int value = 0;+ e8 {  k8 V8 R6 u
    int flag = 1; //判断符号
" w0 V, j! n! P2 H0 J- j4 d# }    while (*str == ' ')  //跳过字符串前面的空格  [! g3 E' Q% E
    {( |/ u/ t- D& j0 L- l' C4 t% S9 I' }
        str++;
7 _# M- V8 C1 y# a, z$ K6 H1 X% a    }' a( ]" p( E5 u  U5 D
    if (*str == '-')  //第一个字符若是‘-’,说明可能是负数# u% n4 i( U% }+ h2 P, M# e, T* V! N( g" q) \- A* N- I. ?
    {" i7 }$ g% x5 R# X4 K8 d6 L* F' S0 w; y% {
        flag = 0;
; E3 X  D- l& Y, N        str++;! i1 ?7 Z7 P3 g* n/ C" v. z* ^) c7 J) @& K5 M
    }* k5 Q. H2 u7 L3 J. o4 @" r5 C# A' |) |% \  m& m
    else if (*str == '+') //第一个字符若是‘+’,说明可能是正数# j0 ~) i0 C1 q" e
    {
( {( `5 Q, |: F4 S3 n        flag = 1;1 F# A* G8 g" C5 \6 c! n& z* p8 w# W) i" f
        str++;- }7 F  L; s+ X6 s' g
    }//第一个字符若不是‘+’‘-’也不是数字字符,直接返回0  f! Q7 E, A" z6 v4 \$ T* U
    else if (*str >= '9' || *str <= '0')
" S+ H, {, V! H+ N. r    {4 D$ I) Y# J7 J* H+ K
        return 0;    9 Y1 ?, b' `6 `; W  S  p
+ Y8 w; }4 v* w, J; E6 p7 [8 F5 }    }' g, y- ?% E3 B0 j' m
  g, b; }: j* ]  e    //当遇到非数字字符或遇到‘\0’时,结束转化4 b" d* t7 \6 I' j# t  c8 j+ U2 R( T8 F2 f5 ]) y" B
    while (*str != '\0' && *str <= '9' && *str >= '0')/ M9 I: B. q/ w" b5 U
    {4 s% d, J- A7 N" M6 X- f8 a5 L  c3 g' b, j8 ]  b
        value = value * 10 + *str - '0'; //将数字字符转为对应的整形数' f: |6 J0 o+ y# f9 A' l+ `; q5 R6 l" b& c0 p( a' Q
        str++;
  S, R! @, @6 {  a/ T4 ~    }' G1 c* p! b$ _7 I0 ^
    if (flag == 0) //负数的情况& e& V7 `$ ?$ [; N
    {, ~$ E3 v4 ]/ x, S+ `! I$ t( q2 q' s+ t
        value = -value;& C; U* _9 D, P. M, N( A5 L+ {
    }8 \5 f" u, o; T
' _' m) V, x! `' F- L) x) w    return value;' Z! U6 I. s& @- v2 ?
}( `" \/ h5 V- p' w* |8 n3 {6 d1 Y: T5 [2 n' K; B  c8 B' n1 y2 W
7 S' U0 X  a2 \) r: J: @4 F/ S* }4 R7 q) K* b7 F3 h
4 S! F) H, B% J4 I' o6 X9 N
效果:字符串:”-123” 转为 -1231 s, p+ [9 s" x  l6 _; e2 r+ ^1 E0 h

, h: E$ ]1 \! Y$ z( ]& g
+ o" C: J5 F8 u7 \, O' G' e& l" B- z; A; i+ L
第二种,如果不带负号:3 }7 x# w8 Y4 t5 ?& c
4 p& B0 q  l5 B6 m/ X9 `7 e! _, y

# |2 G+ x7 z. G' s8 n' Bvoid StrtoDec(uint32_t *pbDest, char *pbSrc, int nLen)0 x" C3 f# R; y  S% ?0 Z
4 P5 J5 m, F6 a# ?) V% R+ g/ o{& N# m' G& r% r9 R, b5 h$ u7 l& v1 Q: ?4 a- g, A. ^
    int i;: t4 Z& F9 k4 [2 ]
    int tmp=0;! I+ N6 Y4 {% e7 J3 x. @; ~! X+ }: h3 ?! D. j
    if(nLen > 10), _3 b% {% N& [& w6 w4 i$ e
: H5 F* A9 u/ ]/ e/ a( [0 x" o        *pbDest = 0;
# P, c. E3 B' {: t; m    tmp = 1;; ^5 W) q' j& \% c& {( F& p( G& j
) ^2 R! A, L: e% |5 b& J    *pbDest = 0;
. A3 C# o# n# J, C4 d) ]    for (i=nLen-1; i>=0; i--)  L: B1 C& d  C0 r. I4 s6 q
    {0 P" ?& T" K) e
& R& X) U& K& y+ r+ B: T        *pbDest += tmp*(*(pbSrc+i)-'0');" p, ^# G5 q' `1 A
9 i% |( p  X5 \1 o! h        tmp = tmp*10;/ Z; _# X& O7 L9 \
+ w3 H, Y  M" U: a. {$ s" {. j    }6 C) r( e1 V' `& ~5 ?
}
, H5 E( B# Q# U. \3 d  B! B
6 e* a" ?5 H7 ~$ O
6 h- |; j+ D  l
效果:字符串:”123” 转为 123( C8 t" c2 r1 Z* T

4 k, D, |* c! F3 z5 f
8 x5 B5 z, L) p6 A# K) e: e- }/ x7 ?2 `, i
第三种:包含转为浮点数:
  i. V, I. d. x0 U) H& M$ y7 P5 }0 D3 d0 Y5 j+ |, P7 O- i0 u& l3 d- D
& Y" u% [9 K0 L0 ]2 {8 }2 i0 e* J' x: ~, P
//m^n函数6 Z+ ?9 Y5 ]- M% f  ~
//返回值:m^n次方.
' |) v/ T; I6 y- cu32 NMEA_Pow(u8 m,u8 n)# X- C% Y* i5 i9 {: I0 n
6 r' U$ t, N" [{. ^9 y4 S! h$ Z$ L6 x6 H
    u32 result=1;    . M; }9 ?5 X7 l( ~! i  A% q( w2 z$ o: j
    while(n--)result*=m;    + C; I, E, c" s5 }4 D7 u
" j3 u" j* e- u' S! [  q    return result;
+ z  i( d2 Z# z: d& e7 Y, O" Z}
, m% C$ M- l8 h8 @- {7 ^//str转换为数字,以','或者'*'结束+ ?" t1 S. Q5 Z" J% F! q- E( {8 o" L" K  U3 J/ Y
//buf:数字存储区4 @" o: O: S( G- E$ Y+ V2 w
7 G9 U# v# ~/ a; L, \; @4 k//dx:小数点位数,返回给调用函数
5 P) N  A; E  S" }- M; N//返回值:转换后的数值& n7 w1 ~8 q; A7 T% d9 J/ c; _( [8 P$ A# E; F
int NMEA_Str2num(u8 *buf,u8*dx)& g- F" B/ `0 g; F0 q: f
# H2 p  R9 O$ h1 E; w4 G0 A7 R{
' e( @- n- v; \1 v    u8 *p=buf;9 l% _" N) |, @; E" O8 F  i% X# N3 f+ g0 N  T8 C3 L
    u32 ires=0,fres=0;
3 l' Y( P1 `8 E: s: p    u8 ilen=0,flen=0,i;  n* M: u+ n; c! ]# e& y) F" e" b# W# Q2 P6 T
    u8 mask=0;
- y1 Q2 T6 P* V* C    int res;6 }; v4 t- Q% j0 `8 E6 S; u2 |
    while(1) //得到整数和小数的长度
* W: h/ s; ], [( }# x* F! P, c: D5 u    {, B; V! U) A3 h' S. s+ [$ s. @/ r# I! W0 _0 d8 L& r1 d* J
        if(*p=='-'){mask|=0X02;p++;}//是负数
, p) z& d- v3 K& T5 t        if(*p==','||(*p=='*'))break;//遇到结束了9 H& j; C$ O% b: H  p! `* Y6 L" Q
        if(*p=='.'){mask|=0X01;p++;}//遇到小数点了" w# h5 n# |$ z  V
        else if(*p>'9'||(*p<'0'))   //有非法字符3 S' I3 C! z3 B. R% ^( q+ H6 q
. R; e" R) b- b5 P+ }        {   0 Y4 z" |$ D4 F# v% M' m0 ~5 H+ b  m& H0 f/ [  a  S
            ilen=0;' z6 K2 L/ J4 _. j' y$ m# |4 m8 w6 `6 c7 k8 H9 K" ?: c" m4 ]- u
            flen=0;0 i, M, p! W# `7 p8 _# B7 P8 M7 G8 k  w! h1 f- B  E" }# c
            break;- K* _( }2 L& F
& |& l" l* h) I3 }        }   
6 x# J7 z" r) x6 U! r0 L8 r  s        if(mask&0X01)flen++;' W% U2 `' ?$ k  K9 r# s7 T' y2 |
! K% i+ m4 B/ ]% n4 g7 r/ w        else ilen++;" M7 H4 ]: o/ i( o8 Z5 T
        p++;
; Q7 n' c/ O/ D" Y. f    }. {0 D- @9 w, n) g: ?
! U+ t& G& ]9 X: E/ {" U    if(mask&0X02)buf++; //去掉负号
' j( W6 m0 c1 l- ~* |9 o    for(i=0;i<ilen;i++) //得到整数部分数据& Z+ x9 `4 v" \0 z8 U2 c
    {  9 O( c* w% x8 O5 V8 g' A
- Z3 d/ H9 U$ F2 ]% [% q  @/ O        ires+=NMEA_Pow(10,ilen-1-i)*(buf-'0');- ^" }3 X8 ~6 k0 a, T
) ^- o% q- Y9 y    }
- K3 w- }6 `  B1 n$ a5 Z    if(flen>5)flen=5;   //最多取5位小数, [" s# P& E% \% R& y0 n
0 w) U* w/ }* y9 d, C1 S# E    *dx=flen;           //小数点位数0 @* |  H& L6 W; J& i' |
    for(i=0;i<flen;i++) //得到小数部分数据" U$ {  w1 ^3 m" \- d" A# G! N( L; U( I- ?  E' a3 L0 e1 o4 k- _
    {  : n7 T% Y( t/ K
        fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0');- V8 P; M) L# K' k5 h
  \4 q9 D/ [' n6 D% c" A    } * h4 v. r! O2 v; N" J" x4 [# ?0 z* r5 s% U) n7 z
    res=ires*NMEA_Pow(10,flen)+fres;
& T3 z2 W( @. u) G6 w    if(mask&0X02)res=-res;         ( A- D5 Y9 L5 m3 X$ g3 @) p
    return res;
, A% c$ l4 S+ s3 H. d, g; Z} : {; c# o# H5 S! {
, ^2 @2 _& V- e1 N4 N+ [
. \4 c9 N( n# S% E
3 h" Y# e. ?* m& i
效果:字符串:”123.456” 先转为 123456,然后除以1000得到123.456" n5 ^0 P) f% @
3 h3 d* Z; f6 s' H, L% b8 |' u0 ]: k/ [' s% t  ?  Z
2 U* H5 M+ \) T. h) c' A

( b8 M. C5 V/ g7 T0 o7 @3 X  t5 Y9 Q
4、十进制转字符串5 f5 M# g3 m) R
# A5 `& A" p/ G( W+ e" A/ _0 q- O, S# m7 H1 b
6 u: ?1 a  n* Z# i7 g2 Q! {8 Y. K; @1 R3 i* {& H# g
2 v5 _4 J! K' i
( u( A. `& Q* L# D: r代码实现:% e: V/ |4 d1 n' O$ C
( t* ~8 i' _! }9 H3 A. E
5 V0 N, D# f0 G; q" C
- N4 F: X/ H- ]2 Q. S# `0 ]; N如果只是单个十进制转字符串,使用sprintf函数就可以了。$ u" i" B; U+ f" f, Q: ?9 a! C% H: L, u: G% H

1 ?" G4 p# K$ Q, n8 }
1 F9 E7 |- D8 A. A/ S+ j
如果是十进制数组:2 ~7 h8 l, k" a* L( z0 I* E
  F$ f5 d( h- B/ Y
4 v' }( i' s  y
/ A% _) E! j1 v- G/ k. j9 o- A4 ~7 k+ X- t# {7 F
u16 DectoStr (u8 *pSrc, u16 SrcLen, u8 *pObj)' z' u* {1 s% X9 T2 t' z. \
{
  o  ~: F/ s. |% e$ Z# F    u16 i=0;& Q! n. e% K# J; ]. \. H4 ~1 m8 }" Q& f# I9 c6 L
) T/ m, w, K* [" H! z. b: a
$ L8 x: {" B: u5 d4 b    for(i=0;    i<SrcLen;   i++): T+ V4 i% Y7 o6 p4 d1 Z" _9 B4 j! Q$ f
    {; H5 K) C7 I/ S+ \# c3 f! r# Q5 B6 l% o0 X, w1 P- N
        sprintf((char *)(pObj + i * 2), "%02d", *(pSrc + i));
- c/ v1 R& G6 k4 G# y    }5 h  }( Y( n. x6 i' f' h
; E0 k+ }8 }1 u5 \& |* p2 J6 k0 Y    *(pObj + i * 2) = '\0';
# M3 l' C) p( u5 [7 Y% Q) j8 z    return  (i * 2);, h7 q0 v$ }8 u* H& i* Z! O# ^# c. E% `; x* \
}- P7 E! M- P2 Q1 |
& o& @/ t6 M6 y; D% J& T
. O& v) N2 U: t
4 f+ W8 k. `9 Q# u$ L: [9 I4 K
7 N- X; ^- M; j0 ?- [
- x6 N; F7 H/ G) q9 C7 p效果:十进制数组13 14转为字符串“1314”
  F- ^2 _$ R5 U/ m% p2 q- }2 [' H7 c$ ?2 C
) E6 T& h3 r! O( a0 P# Y
( N+ a5 a# W2 q
1 w; z/ c$ A$ Z' ^, j; \( G
$ j2 R8 p# H2 p9 o" c5、u8、u32转换
, L3 w2 g9 z5 }4 K8 N# b5 p5 |. K# R4 \; y4 s. g# n3 t5 T) E$ {/ f" u
$ U- m- h' h" d( e
8 l! Q- a6 d) C
7 c; x; D4 L0 m3 @, W
9 S1 R. R* M6 P  T举个栗子:ASCII码里  n5 y, l3 U) y, x+ u1 b) L
2 A8 g* l8 T6 O! d# n3 R  @
8 Y5 r& n# `9 f! V5 X/ o: v3 Q
' {7 z" }6 j4 j$ l" f+ p/ _. z2 T
( [" P3 D, K' c4 S3 e% w) Y
0 m2 p1 r( V8 k  g& B. T
, y6 ?: _9 E$ L; Q! s  A& C
4 G& M6 ~* |( I% w$ T3 o: f' H/ t' j" s
这里写图片描述 字符‘A’ , 一个字节8bit ,即u8 十六进制为 0x41 二进制为 0100 00017 k' N. w0 c4 U# g5 t$ F6 c
) M) l; ]8 G4 _) L, ~5 t
& i9 K) g  a0 K9 P% P2 [5 p$ y& x
而对应的十进制为 65 整型65,4个字节32bit,即u32 十六进制为 0x41 二进制为 0000 0000 0000 0000 0000 0000 0100 0001
) l$ ?( d- A' B; `8 O7 [7 S- f# V
6 T& T  b9 F0 G# |' A
/ M2 L2 a. y& S( S! k
将u32数转换成u8数组: r+ o' _; y. ?& v' w+ {/ ?

$ p9 k: n% n, f0 W4 v1 F
9 [  T: f# w) \  ]# E( n
' Y/ F  Z) z3 d9 a' `+ U5 |% v注意:这里是字符数组,不是字符串) }7 @) i* O/ p* t! f
0 W; e$ g; R9 b# N& C. d
- @- Y. I* H8 _+ K- t0 c
0 T" `7 H3 b( Y* i  H2 I% I/ \- b' w
字符串是以空字符(\0)结尾的char数组
. |& ?" n0 m- Z+ o8 j  H$ k9 P1 {# S- r1 G1 a! U& Y  l8 X7 a6 y
( a, @* T' z) C, b, S+ Q! e
0 s2 T) ^( U' r9 Mvoid U32ToU8Array(uint8_t *buf, uint32_t u32Value){
% [2 f& Y, U5 G0 v* x. Q3 _+ j$ ~    buf[0] = ((u32Value >> 24) & 0xFF);
7 S9 H. G% g8 Q; V/ d    buf[1] = ((u32Value >> 16) & 0xFF);7 u- q: ~9 {! |9 p0 r- u4 v
) f. Y2 ~9 U3 J    buf[2] = ((u32Value >> 8) & 0xFF);4 N' u5 k  t7 f0 K( F# k8 g! F" |' _4 u
    buf[3] = (u32Value & 0xFF);' x4 u7 Q) g( f) L: @1 a9 B
9 X9 f/ ?& _5 l% r}
' P! g9 Y' h* t* U3 ]; H3 V- n# V% U
- Y3 Y/ a, X; q. q5 I: D, J9 b# z; O9 W" v( `) Z( I
+ F& [  |' N+ a
效果:整型 50 转字符数组 {‘\0’,’\0’,’\0’,’2’}0 `: G! ^( o/ g. q. |& h, z
& e8 }' \' H% `7 n5 @3 X5 A3 |# \% k
1 N3 j6 v/ e7 a) q
6 A, N; i# O% M* }6 R) n$ u$ `* M: Q& g% c' z; U! H/ e" R
u8数组转u320 S9 _+ z" G6 }  }1 e- J! Y6 X& `
; f  u$ a- `  Y' b/ r5 Z4 I( d; X) R/ g( M* g
+ G" J) E, F) o; A4 X9 Z1 V2 [
void U8ArrayToU32(uint8_t *buf, uint32_t *u32Value)7 C8 [! e8 G$ |' `) H
0 x( t  b/ A; P, s{7 r: }# R+ H) |" H! u  k' s
    *u32Value = (buf[0] <<24) + (buf[1] <<16) + (buf[2] <<8) + (buf[3] <<0);, P0 K& A& s2 n, d2 c1 G
}9 V9 W2 g0 C  I6 L- S7 _  r' B& @4 g+ l: M6 m& w
. i0 m4 y& A2 `2 y
, C7 |  P5 P( Z+ e! ?' I; ~- `. s3 ?0 U9 i. H8 X0 o0 c- T& l: ]
效果:字符数组 {‘\0’,’\0’,’\0’,’2’}转为整型 50
3 x5 m- M/ Z6 O# ~2 X8 ^; t7 n, Q( l, B1 A5 C" L' z: h. g  E$ d# O
. ?. ^/ B( W2 u8 }7 _9 I2 i( I. s& W/ f$ V: C

/ u0 F* g# P7 Q; W0 u2 \5 q6、大端小端8 n/ I1 v0 @  }0 t
2 i0 `+ S2 I# q( A6 [3 i2 o  ]3 n2 e; E$ i# a$ ^
2 n! ?$ ]1 q. ^% z
- _2 R& E7 ^2 I0 h. o* \" [
* j& n& l9 i6 X% w( O  v7 v( [. ~, m5 P5 j$ F5 k% l, B) y2 W
最后就是大小端问题了。STM32 默认是小端模式的,那么该如何转为大端?9 U0 f8 O% n% A( M6 z5 z+ L
2 W" x* _9 \) T2 A
: J) v; V% y; e$ _; R  y6 ~0 J

' x4 I8 J- O/ x' {2 ?1、转为大端- n) [7 x; F5 q( u
1 w  O" g$ m4 `% J, ]. @# c+ r/ `8 I: t" a& t# h6 Q

+ E" ?3 _- `& B% a5 d为大端:5 U/ S$ [% }7 W  Y) U* U3 V: V
pPack[0] = (u8)((len >> 8) & 0xFF);2 }2 e' L& J0 \' j; M
% _7 W/ i: W  OpPack[1] = (u8)(len & 0xFF);' n( e; G# p* h
5 ~! ~# ~  T+ @* [) x3 i7 N. _! z7 V& C
为小端:( P3 j" B; Q' c/ q- P; @/ P  K; ~# p! i% L* `
pPack[0] = (u8)(len & 0xFF);+ T4 ~+ A+ [  p/ U( U/ Y& j9 H2 H- [9 s. n5 V+ O; {& f
pPack[1] =  (u8)((len >> 8) & 0xFF);" e; I4 \& D2 L! ~5 Z9 m5 F
$ \" |: n- p" c
9 a' V8 \3 t- {; s) P- y$ L- A( p5 K
2 S; }/ M6 V6 x2 ^- F% K9 D! P7 T7 c
" v& o' ]# V) x& t( I# J
效果:len为数据类型为 u16(short),比如 0x11 0x22,转为u8(usigned char)数组。
* G! l& E3 b, c# k* X2 a' O& y! K& c, j# Z/ Z7 H1 O
3 \" W+ `$ i% y! I
2 D4 k( |( X; W2 G5 H, x3 ^: T+ R大端为:
9 y. R2 j% j6 L- H- S# `4 W1 Z, t: h
. o- x8 N, @/ e3 [5 _# \

- M3 m9 V! p& ~pPack[0] (0x11 )9 S+ T5 ?) X, _4 T" G
pPack[1] (0x22) ( z* k) {& l) D
' |6 i4 N2 j  T: c: T
+ F7 K4 Q1 n0 @- o: D) U7 X4 l2 z+ j% n% \5 G& y- ^

9 E5 H9 V- X. U( Y( A小端为:1 M$ ?" T9 R# e+ m: @

( u5 W7 L: b4 f3 u# j3 X6 S
) [- |8 r5 \) N9 [7 q! t: O
" P# L+ x  n$ V( c3 Y; jpPack[0] (0x22) , Q2 R5 \: R" k2 ^2 V
) c% Q2 l7 D" W/ q5 W- bpPack[1] (0x11)

% ^* Y4 f2 e2 E$ A0 D$ b4 J- o
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-25 13:41 , Processed in 0.109375 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表