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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
1、字符串转十六进制代码实现:. ~7 I$ g. v% W  M+ `) w7 m6 v/ S
# U9 f6 \. I3 X% y! H# c& S
void StrToHex(char *pbDest, char *pbSrc, int nLen)$* Q& u9 d8 {2 k8 a0 K2 _" D0 R
{: L0 T2 P$ F0 |
  char h1,h2;: p6 q3 B: p3 `* T' B& d+ i
  char s1,s2;
8 k, r9 J* ?3 R  int i;,

0 i9 V) z6 q5 G. M* a: d6 D7 }/ A/ w  M( }5 ~; H( g3 f$ b* h
    for (i=0; i<nLen/2; i++)% _. ^& i. ?, G& d7 L) E9 K* P! F% |6 v4 |% k: I, b. \
    {& ~8 R! ]' t8 @1 j) }$ E
        h1 = pbSrc[2*i];% Q3 g  K7 A8 W$ Y6 B& }* O7 F
        h2 = pbSrc[2*i+1];& h  U2 q( I5 K& }4 `9 R
: M/ F# b# l% K8 N
( s4 N) C- i  D! b, t6 @        s1 = toupper(h1) - 0x30; //toupper 转换为大写字母+ j3 ~& Y$ t" V) U  [+ b2 @
        if (s1 > 9)
+ L- U& P! R2 ^; v8 z1 }            s1 -= 7;* ~) H5 z! U$ a- w5 _
/ ~' C! {/ [( P$ r        s2 = toupper(h2) - 0x30;$ w$ i7 p% e* z8 Q0 t0 T- l3 C1 c6 h2 c: u8 L+ q& r3 R8 s/ i
        if (s2 > 9)4 x5 |0 `4 V, _0 }2 m( S2 \
/ R3 K  P: g; x# p            s2 -= 7;0 z- a, {, S+ B0 s
# i8 }' C5 G6 X! e" V, g; H( y$ V. e( u" i" W+ w
        pbDest = s1*16 + s2;
; W! A' d1 _- o    }3 V: s+ ~3 h0 u2 P5 d$ ]0 v
% M+ d4 v' B5 X# u. F( B/ z}
7 c) v% d# x) x. F* |

9 }9 `* L4 w# ~4 M& Y6 Y
4 i4 @: r/ ]6 i
/ u! i) s" h" Z, B
2、十六进制转字符串8 Y( u5 r4 {2 w* B, y; I
' Q  U+ ^4 ~1 ?+ T9 f: c7 F) Y9 `( d7 s4 j; |6 T2 B% p' R) k3 t, W7 D
代码实现:# v3 }6 e1 Q  b0 F$ y
1 c  ?2 x+ M  [& w' t4 b( _- k7 [' p; `8 q  \+ l# w
' z' c& H0 V; j0 \9 J. T
0 Q4 _$ X; g% g. Z& F( f  G; w- f5 M$ N* r  {
void HexToStr(char *pszDest, char *pbSrc, int nLen)6 i, {5 Q' B" f0 U6 S! L9 Q& b( S
{6 `7 K4 J/ L2 K4 ]/ i  j' Y9 [1 W
( O% l& Q3 D+ ]8 C& g) ]    char    ddl, ddh;
( T5 `  v; ^  F% V' \( W    for (int i = 0; i < nLen; i++)
$ R# A+ b% w1 P9 S1 P( N2 H    {$ F# ~" s2 l" D! S. t, m  |" ?! p3 T% E  K$ h+ H% w  d8 f
        ddh = 48 + pbSrc / 16;' F$ N2 u7 ~( N5 n8 \; {
        ddl = 48 + pbSrc % 16;2 T4 ?0 t. m! p# y/ [7 P& ^
! E8 X- Z3 t' e5 {. V        if (ddh > 57) ddh = ddh + 7;
% E& F! t# F, u+ z4 E4 P        if (ddl > 57) ddl = ddl + 7;9 [: c) b3 y9 N( J/ {
1 P. ]* ?8 _, J. J; e* j! e        pszDest[i * 2] = ddh;
  _' J  N8 W1 F  N% f; ~9 ~- T" f        pszDest[i * 2 + 1] = ddl;8 X0 }2 i: ~" h7 G' V) V9 }7 ?" _: {! d, B5 i( p( \9 X
    }  F2 ]7 I* M4 K( d! V- P
    pszDest[nLen * 2] = '\0';
- ^! l/ d7 N) Z$ i( Y1 x}/ v6 x+ Z, R* a6 Z
或者
" f5 ^9 a" _  L# j- X8 j
u16 Hex2StringArray (u8 *pSrc,  u16 SrcLen, u8 *pObj)  q+ B, g# L' X
{$ W' N% |2 y9 J3 K4 _, [9 J' x4 S! _6 C
    u16 i=0;9 ^$ ~! d. M8 k7 {, {$ x5 |3 l3 {7 {& h5 \

) b- m& z: C! Z' f    for(i=0;    i<SrcLen;   i++)3 |3 q4 s4 i' K  z, w8 w
    {* ^4 T6 f0 l! `% J* U  i! K# G2 S. b) c" Y: M, _  O! n
        sprintf((char *)(pObj + i * 2), "%02X", *(pSrc + i));! |( h# g0 u; \7 P; g, B4 t2 s- M; c( h8 M
    }6 k0 V! h1 i( A& H: L3 e! R: j- r+ v1 \' A$ y9 Y+ C' w
    *(pObj + i * 2) = '\0';
7 u/ {# u: o/ q) K/ ~    return  (i * 2);( a% j. w/ g4 D9 J7 p
}8 s3 a+ }' R' P3 a! `9 J% U8 w4 D3 @) @
8 m8 c- U2 n3 H, E% z+ H* ?
  u; l9 Y+ z% _5 r# q2 f: Q: l  t. P- D8 h* [8 H" _% p  f
效果:十六进制:0x13 0xAA 0x02转为字符串:”13AAA2”* W) l3 P! O2 s& ~8 c% R
* d& y# g5 k9 f0 E, j8 E$ H  U* s$ U/ s% l7 n- U" q( L
! q! l  x; w  A" }; c3 R
3、字符串转十进制$ a( x4 e. @1 |4 E- U2 K5 b4 X( G" }+ X5 Q1 W- |
2 [3 F0 a8 D7 j0 v
代码实现:% j3 s  \5 o) L! |9 e/ v3 s/ B$ c9 p( _! r) k8 u: {5 a
' Y' U7 M6 z. I  R

2 M- c1 i9 y9 l' d1 V& H- l/ X第一种,如果带负号 这个就是atoi函数的实现:
: F6 K1 Y3 T3 |7 N/ @
! r) U$ Y, v7 G* E
- |( m* E: `) V" C: `4 g
int my_atoi(const char *str)
; ?0 c' n& K( W8 E4 }( w{6 t% |5 Z# V2 P+ J/ z# C& }+ i/ e6 F9 i( z: a* E
    int value = 0;$ \4 z$ k1 M% O6 e# b: n
    int flag = 1; //判断符号
5 j! A0 E3 J% q    while (*str == ' ')  //跳过字符串前面的空格% Y# O, ~, F0 m/ B) t5 `
    {( |/ u/ t- D& j0 L
! [4 I0 c2 c4 e2 f9 H) y        str++;
9 Q; T! E; n* k* p) f    }
' q- C! x- M1 J# H7 u  s    if (*str == '-')  //第一个字符若是‘-’,说明可能是负数# u% n4 i( U% }+ h2 P% N0 H9 a& c( z2 J6 f7 X
    {" i7 }$ g% x5 R# X4 K
  Y8 h  t  k  Z8 j        flag = 0;
' B/ o/ R: G  w4 s        str++;! i1 ?7 Z7 P3 g* n/ C- [! S7 ]  a3 N$ b, x! P
    }* k5 Q. H2 u7 L3 J. o4 @
3 s: Y9 I2 G" m# [4 R* V    else if (*str == '+') //第一个字符若是‘+’,说明可能是正数
5 z, b5 I- @% p+ T# o/ x    {
) @2 l. H1 J3 M1 t& A! L7 ]        flag = 1;1 F# A* G8 g" C5 \
3 \, T( ~3 U0 ?$ z& O2 k        str++;
" J; g3 q7 J% T* E1 A9 j    }//第一个字符若不是‘+’‘-’也不是数字字符,直接返回0. |- A- r, x7 l
    else if (*str >= '9' || *str <= '0')
# ]9 @4 X1 I' H7 r: c+ z    {
3 h8 _& o) N( x/ v* b        return 0;    9 Y1 ?, b' `6 `; W  S  p
9 g- b9 f% m7 s3 A- O4 H# f* J: _    }' g, y- ?% E3 B0 j' m) g0 b  L9 k. z/ z- S- ?
    //当遇到非数字字符或遇到‘\0’时,结束转化4 b" d* t7 \6 I' j# t4 i1 F! ?3 V7 @8 e' ~0 E" K6 o6 M
    while (*str != '\0' && *str <= '9' && *str >= '0')
2 @% n: }6 v4 ~' j2 ]0 x    {4 s% d, J- A7 N" M6 X- f6 ?' e2 y% j* a% v$ N8 r
        value = value * 10 + *str - '0'; //将数字字符转为对应的整形数' f: |6 J0 o+ y# f
8 e; z, @) v1 s. D        str++;: Y9 U" g8 G' p! z# f, v) E; g6 i
    }
! j: n2 X8 T; W0 b2 @0 t    if (flag == 0) //负数的情况- O; ]& I5 E8 R+ j' u, \2 d: S: K
    {, ~$ E3 v4 ]/ x, S
; s, r5 [; N" `* `5 c3 k        value = -value;
# v% h  ?& {7 b9 k' \    }8 \5 f" u, o; T
9 p: _' B9 l6 S- y    return value;
7 n% _* _' z3 A  j}( `" \/ h5 V- p' w* |8 n3 {6 A2 u, X% u' j' o1 p+ v" o
7 S' U0 X  a2 \) r: J: @4 F/ S* }
  _$ m  P$ B" e" }" L: A. f2 z, C

" f0 s( `$ D% W2 ~效果:字符串:”-123” 转为 -1231 s, p+ [9 s" x  l7 |5 }9 _% [' q& @3 _0 z& @# x

0 d- ?0 X0 B9 ]* }5 I
+ o" C: J5 F8 u7 \, O' Z; `6 P! T' D5 h. e) X
第二种,如果不带负号:3 }7 x# w8 Y4 t5 ?& c7 d, T6 E- D4 j0 G6 B1 Z$ A5 d
3 w3 W& ~4 Y8 R$ F
; o2 X" t. V; f1 X" r
void StrtoDec(uint32_t *pbDest, char *pbSrc, int nLen)0 x" C3 f# R; y  S% ?0 Z
, i9 Q4 P% w" A" @& k/ M: Q! G/ \{& N# m' G& r% r9 R, b5 h" e# o3 ~2 M/ E  O/ X* M
    int i;
% W" t) o2 L  g" p0 ]: a5 h    int tmp=0;! I+ N6 Y4 {% e7 J3 x. @; ~! X
$ O- Z' Q2 |+ @9 c8 o- Z    if(nLen > 10), _3 b% {% N& [& w6 w4 i$ e
, I' Y  b5 Q& o- Z0 N) W* V        *pbDest = 0;
5 G+ M5 K$ h: M6 j- N0 Z; R    tmp = 1;; ^5 W) q' j& \% c& {( F& p( G& j
: B# z$ {$ ?" E) l8 F8 }0 c    *pbDest = 0;; S- v3 U! e. C
    for (i=nLen-1; i>=0; i--): T) G4 a, H" a/ Q
    {0 P" ?& T" K) e7 Q  K; x* ], S
        *pbDest += tmp*(*(pbSrc+i)-'0');" p, ^# G5 q' `1 A
+ Y4 d4 q! G& H* F7 s        tmp = tmp*10;/ Z; _# X& O7 L9 \, c; E& Q6 D& P
    }; P2 O5 F" U8 M& g& D- W( d2 {
}4 r3 r+ Q$ f, W# o0 R5 V( t

# J& z. r+ j3 M& C" W- Q) t

1 C0 S4 s! Z# V2 c3 p效果:字符串:”123” 转为 123
( N2 c8 r: R5 o8 `8 O  g' t$ Q
0 Q% s! w9 E5 i, S$ D. c
8 x5 B5 z, L) p6 A# K
# z+ ?) W/ ]9 B9 t2 C" _第三种:包含转为浮点数:
, p- E: ]: p9 x/ {$ y7 P5 }0 D3 d0 Y5 j
( j2 h2 T7 N( d4 v2 g, @& `8 M! t
& Y" u% [9 K0 L0 ]
$ P, V# j' v/ P. }- H//m^n函数
9 b+ T- R7 c& Y1 A& ]% W//返回值:m^n次方.) V* v; B/ l9 z  ^
u32 NMEA_Pow(u8 m,u8 n)# X- C% Y* i5 i9 {: I0 n$ M& K* Z1 `( y6 f% H4 B
{
! M1 U" |) g) h    u32 result=1;    . M; }9 ?5 X7 l( ~
6 W3 F* t0 K# }( E  @* i2 I    while(n--)result*=m;    + C; I, E, c" s5 }4 D7 u
$ j; q1 [" ^% x0 U- B    return result;
( `' }+ X5 c2 @# H; R7 C}
& Q0 s1 |; a/ M- S8 w/ s; n//str转换为数字,以','或者'*'结束+ ?" t1 S. Q5 Z" J% F! q- E( {6 X; @* a( p4 `
//buf:数字存储区4 @" o: O: S( G- E$ Y+ V2 w
% H& {% n* A8 h, W: c/ |; ]//dx:小数点位数,返回给调用函数- W" K- v2 A7 t' X. D7 _1 V
//返回值:转换后的数值& n7 w1 ~8 q; A7 T% d/ ^: [5 m2 N- e! G+ I
int NMEA_Str2num(u8 *buf,u8*dx)& g- F" B/ `0 g; F0 q: f
+ v" _% N) m: P{
  B0 f+ p) P9 r    u8 *p=buf;9 l% _" N) |, @; E" O8 F
- M( U, l' D/ j( z' X& P3 y; e    u32 ires=0,fres=0;4 S, k) t7 |8 H2 E' m
    u8 ilen=0,flen=0,i;  n* M: u+ n; c! ]# e# P( k9 K7 W- `7 l9 N
    u8 mask=0;
6 T+ p7 `  Z9 Z6 T    int res;, q4 n9 `, |) O
    while(1) //得到整数和小数的长度9 Z  y. Y, N  r+ q
    {, B; V! U) A3 h' S. s+ [$ s, a% y; s0 a$ X) M7 z! H4 W; @
        if(*p=='-'){mask|=0X02;p++;}//是负数7 M: J  k5 t+ ~/ l8 p
        if(*p==','||(*p=='*'))break;//遇到结束了+ Z5 m/ _* h  N0 L2 r+ {
        if(*p=='.'){mask|=0X01;p++;}//遇到小数点了$ w& t: @3 w! h4 n: ]( k
        else if(*p>'9'||(*p<'0'))   //有非法字符3 S' I3 C! z3 B. R% ^( q+ H6 q
1 W* b) B! n" _* S, P+ f4 O3 v5 ?        {   0 Y4 z" |$ D4 F# v% M' m0 ~3 B! Z4 s& \' l' r
            ilen=0;' z6 K2 L/ J4 _. j' y$ m# |4 m8 w
) f4 w$ Z' w/ l1 u; k0 Q- I0 n# X) S            flen=0;0 i, M, p! W# `7 p8 _# B7 P
3 j+ `9 y4 [3 q            break;- K* _( }2 L& F  U1 A6 U& T5 r
        }   
: n; i$ }8 O6 {" ~/ a4 O$ i        if(mask&0X01)flen++;' W% U2 `' ?$ k  K9 r# s7 T' y2 |
+ c( E) S( s) B4 A* i4 s+ V1 b        else ilen++;
& B! \  B+ \: O        p++;1 ?/ J' E& M% T, e1 g+ {3 d
    }. {0 D- @9 w, n) g: ?
* v$ z) J% d: {3 G) V- _' E1 _; J* E    if(mask&0X02)buf++; //去掉负号
1 Z# b9 G5 }7 R" k1 }( K    for(i=0;i<ilen;i++) //得到整数部分数据8 j( H* Z4 h3 E# M( M5 C
    {  9 O( c* w% x8 O5 V8 g' A4 I3 ^( Q- ]0 B2 {# M  `: X3 X
        ires+=NMEA_Pow(10,ilen-1-i)*(buf-'0');- ^" }3 X8 ~6 k0 a, T3 s1 @1 M7 b1 A) u* F8 l" G
    }! o: u' Y& ^! ~* @; R( m$ O
    if(flen>5)flen=5;   //最多取5位小数, [" s# P& E% \% R& y0 n5 u9 L0 L6 E/ ?3 d5 Z
    *dx=flen;           //小数点位数
$ c) A. D* {$ I8 D* I' I    for(i=0;i<flen;i++) //得到小数部分数据" U$ {  w1 ^3 m" \- d" A# G! N( L
" e# a3 x; M9 |" v$ M, c# w    {    G! X3 ?- Z; K; e+ P& d0 ~+ |9 o; {: ]
        fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0');- V8 P; M) L# K' k5 h) j9 L: L7 {9 _* l! b# a
    } * h4 v. r! O2 v; N" J" x
. g9 i2 s4 n& ^    res=ires*NMEA_Pow(10,flen)+fres;4 w/ `  N, e( y; y1 m8 t
    if(mask&0X02)res=-res;         , o  V% n9 J0 U9 `
    return res;# _- }. u3 {2 i! Z2 U$ `
} : {; c# o# H5 S! {
" O/ u, H- ~0 g# r3 A
5 s. V8 M. F( q9 ?4 w$ c

5 ^& B# P! r; N, Y+ i. q! m9 E) |效果:字符串:”123.456” 先转为 123456,然后除以1000得到123.456" n5 ^0 P) f% @
) H0 c  J6 s. u% }! B. }: I% {% b8 |' u0 ]: k/ [' s% t  ?  Z
3 N% q5 e, Z$ u, }6 S% X. W

: I" k  y+ g- j/ B' G3 J7 w- F3 N6 a7 y: N
4、十进制转字符串5 f5 M# g3 m) R
. W7 Z$ f# u4 f; I( t  g( Q" Z5 P, H
6 u: ?1 a  n* Z# i7 g9 M: Q; y. _. r
2 v5 _4 J! K' i0 C) _& c0 Y* T  P. U2 {, p/ Y& o
代码实现:+ J! ]- @8 p7 O0 s" O2 m5 t
/ [, z9 U  Y% [# g- x+ D+ }8 `2 \4 k
5 V0 N, D# f0 G; q" C
6 |. `- m  K; _% a7 o如果只是单个十进制转字符串,使用sprintf函数就可以了。$ u" i" B; U+ f" f, Q
0 w. v! Z& }: K1 ^0 J: f1 p" K6 ^, Y8 z' @% @/ J! M' i

- \) `, S& O5 s5 ^. L如果是十进制数组:2 ~7 h8 l, k" a* L( z0 I* E2 N# R7 W/ U3 \0 l* }5 s' l% _( h

. S- R9 g1 r$ m, j5 P4 c1 ~9 S3 v
/ A% _) E! j1 v- G/ k  N6 B, s% `: f7 [4 @2 V& k  w' c
u16 DectoStr (u8 *pSrc, u16 SrcLen, u8 *pObj)
; i4 J, `2 Y  u6 ?  ]% Y% ~. B% B{
* _8 l! c. X4 }: o    u16 i=0;& Q! n. e% K# J; ]. \
0 c# X# V. _6 j* N) T/ m, w, K* [" H! z. b: a$ p* Y" u0 _) w' x! E. E* T" V- E
    for(i=0;    i<SrcLen;   i++): T+ V4 i% Y7 o6 p4 d1 Z; v4 ^  F4 R& Y
    {; H5 K) C7 I/ S+ \# c3 f
# }5 ]) A; C' e7 a) a        sprintf((char *)(pObj + i * 2), "%02d", *(pSrc + i));; G/ o/ F+ S7 T7 {
    }5 h  }( Y( n. x6 i' f' h
5 e7 J. ~0 T+ c) @( `    *(pObj + i * 2) = '\0';
3 p5 X$ K& x+ e) f/ ~' I    return  (i * 2);, h7 q0 v$ }8 u* H& i
  N/ D4 U* f* I8 T+ O9 K  q' `}- P7 E! M- P2 Q1 |- Z: ?- J" g- Y
. O& v) N2 U: t3 u& K, |( ^% R+ E( u  r$ u
7 N- X; ^- M; j0 ?- [+ x9 Q, v  p6 ^& A5 }
效果:十进制数组13 14转为字符串“1314”
, o5 g1 N  Y  R& Y2 q- }2 [' H7 c$ ?2 C7 [% I6 I: q4 t1 E' p5 y4 N' r
( N+ a5 a# W2 q
9 n- F1 r( L2 E2 [( k/ ]. h7 H- n+ D# J- R
5、u8、u32转换
9 }5 O/ |! {7 K: d* I6 m* l) {3 T5 |. K# R4 \; y4 s. g# n3 t) g4 Y- g7 ]8 o6 j8 t
$ U- m- h' h" d( e" g; Z. C( z; z1 e" P' t9 a0 q( S: k
7 c; x; D4 L0 m3 @, W0 z$ t4 f+ L7 W8 c8 g5 o
举个栗子:ASCII码里% }! R: z) N6 C0 G3 ]

5 q7 N+ |9 ]# \! ]4 P4 B
8 Y5 r& n# `9 f! V5 X/ o: v3 Q
( Z( R2 }5 F6 B
( [" P3 D, K' c4 S3 e% w) Y) U9 p5 V' w9 Y4 O

5 D7 B1 {" C  D
4 G& M6 ~* |( I; o+ K' k( d: X; q$ ?  v
这里写图片描述 字符‘A’ , 一个字节8bit ,即u8 十六进制为 0x41 二进制为 0100 0001( A5 [1 o- `  }6 o$ N7 M- b- j

8 Q! @, ^( u- v/ {5 n4 _) k% z3 T9 X* u
* [) y% \& r) `) L' l8 T
而对应的十进制为 65 整型65,4个字节32bit,即u32 十六进制为 0x41 二进制为 0000 0000 0000 0000 0000 0000 0100 0001; J: T, ?( D6 f& Y6 N( |, {1 Y  Z0 @
; `8 O7 [7 S- f# V
& s" F: \" u9 R' p) v7 P* I

) P- V+ `7 G9 @/ S! |+ O将u32数转换成u8数组
) _$ j7 k8 ?1 f
% H( ~0 Q3 ~6 z) I
9 [  T: f# w) \  ]# E( n6 ]' Q1 p7 B: F. s. s
注意:这里是字符数组,不是字符串
3 F# V) F9 A$ y; B0 W; e$ g; R9 b# N& C. d/ i- Q, j/ A1 S& Z4 P# o5 x  i, B

1 C% b/ V2 k; P! N; V字符串是以空字符(\0)结尾的char数组3 T9 i# ~; f+ Y0 y, g  c- {
  H$ k9 P1 {# S- r1 G
0 X& p) D& [5 r, e" }1 @; h
( a, @* T' z) C, b, S+ Q! e2 M3 w5 u) f: c4 h
void U32ToU8Array(uint8_t *buf, uint32_t u32Value){7 I' H% D! M& [: l1 h4 w
    buf[0] = ((u32Value >> 24) & 0xFF);# d! o+ B2 z* L# n, j- l$ z
    buf[1] = ((u32Value >> 16) & 0xFF);7 u- q: ~9 {! |9 p0 r- u4 v
- K7 Z  l+ q7 m9 b2 I8 _7 P    buf[2] = ((u32Value >> 8) & 0xFF);4 N' u5 k  t7 f0 K3 [% k- W7 o- ?1 y$ Y/ x
    buf[3] = (u32Value & 0xFF);' x4 u7 Q) g( f) L: @1 a9 B
! b* g- n, k( i7 l}
; s6 z; I- k) v* k5 l4 J! D
- Y3 Y/ a, X; q. q5 I  Y  J, w& C  h" ?0 j8 {

, h8 M# a& E/ ^! J# Y, i. j效果:整型 50 转字符数组 {‘\0’,’\0’,’\0’,’2’}0 `: G! ^( o/ g. q. |& h, z
* |7 u( @0 \  I7 f6 B
/ Q1 J: c* F2 G: x, @' r2 w; Z
6 A, N; i# O% M* }6 R) n$ u
- U2 r* `7 K- _' o* K$ Y( Ju8数组转u320 S9 _+ z" G6 }  }1 e- J! Y6 X& `, j6 I  G$ d  G/ G5 T7 ]

- J' n$ w  m+ t7 e4 d5 p

) d! z. z0 F( y$ p) p2 r; ?3 F9 Gvoid U8ArrayToU32(uint8_t *buf, uint32_t *u32Value)7 C8 [! e8 G$ |' `) H! `8 e0 K7 H# z# e/ s, ~
{
4 X* M2 m. Z' y7 ~    *u32Value = (buf[0] <<24) + (buf[1] <<16) + (buf[2] <<8) + (buf[3] <<0);* f8 `8 p0 c5 F9 H/ o
}9 V9 W2 g0 C  I6 L- S
4 Z% x" W. w) a

7 w2 `" s  h% ^6 E* s# y% Y' y& j' L
, C7 |  P5 P( Z+ e! ?' I; ~- `1 }2 |1 y$ R% N- b$ T
效果:字符数组 {‘\0’,’\0’,’\0’,’2’}转为整型 50
0 k( |% E. G! e6 b; o3 d8 ^; t7 n, Q( l, B1 A
; _: k, T5 z7 X
. ?. ^/ B( W2 u8 }7 _2 {6 }) J4 ^" }3 X( a6 v$ d

. ?7 H. }) B4 L1 g+ G9 _6、大端小端8 n/ I1 v0 @  }0 t3 k4 ~' h1 L* u: ?0 X! Z. @

/ L" H; v) t1 y; ?7 E/ k2 n! ?$ ]1 q. ^% z
7 q# z* c3 J* H$ Y. P+ ~
* j& n& l9 i6 X% w( O  v7 v( [
4 T, l- G, E! w最后就是大小端问题了。STM32 默认是小端模式的,那么该如何转为大端?( ]( J; I# h7 l6 p* H3 d
2 W" x* _9 \) T2 A! e! p- K) s- Q5 X! A9 ]7 Q
$ j/ S% f% c2 ~, \/ v; W( I" J/ g' w
1、转为大端
) `& E" b; J  P* s6 t( |# M1 w  O" g$ m4 `% J, ]. @# c+ r/ `6 U2 A6 L% P5 M/ f2 r6 f

9 ^* ^) D* w% r3 {1 s3 D为大端:
* _' P( ~: t8 w2 I  ppPack[0] = (u8)((len >> 8) & 0xFF);2 }2 e' L& J0 \' j; M" K9 X) h1 d# T' Y# }
pPack[1] = (u8)(len & 0xFF);' n( e; G# p* h* Y( d( t3 d/ C. U( ^- r' n

: y4 ~: F7 j: C7 a" b. x. |为小端:( P3 j" B; Q' c/ q' l1 @0 S9 q. z
pPack[0] = (u8)(len & 0xFF);+ T4 ~+ A+ [  p/ U( U/ Y& j9 H1 e2 X- W" V1 f
pPack[1] =  (u8)((len >> 8) & 0xFF);" e; I4 \& D2 L! ~5 Z9 m5 F
# r' n4 S( E" P* w$ _2 t
9 a' V8 \3 t- {; s) P- y$ L- A( p5 K
9 t  `2 k* ?2 f4 t5 k6 W: @
2 v0 _4 t* s( ?4 O1 p9 y
效果:len为数据类型为 u16(short),比如 0x11 0x22,转为u8(usigned char)数组。' n! H  ~- l1 z+ V+ O' i' ^( L7 A

8 m. t- R4 b& ^; N
3 \" W+ `$ i% y! I. G# w5 H4 S0 Y/ }
大端为:- r/ `( C  e, ^1 c
# `4 W1 Z, t: h
) J; n- G2 w* P
$ \, G5 |/ I7 ?; ]
pPack[0] (0x11 )7 Z3 v% u% Q! s7 E% E
pPack[1] (0x22) ( z* k) {& l) D
: k- e; M  B4 _7 ]
+ F7 K4 Q1 n0 @- o: D) U6 M" ]6 I& B4 n: R) K) ^7 V- x. U

' N; J: K  C; V- Y% P' T小端为:
1 {  `' g6 G  O; c2 J: q/ d: w0 I+ N
) [- |8 r5 \) N9 [7 q! t: O
0 [8 \  S  s6 j- F1 vpPack[0] (0x22) , Q2 R5 \: R" k2 ^2 V
+ K7 @  X1 R2 R+ UpPack[1] (0x11)
, V+ l9 F' H# Y7 A, N4 T' r; {, B! c7 N

4 T: h4 g4 w2 M2 L: }9 h
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-29 23:20 , Processed in 0.125000 second(s), 24 queries , Gzip On.

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

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

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