|
|
发表于 2010-1-19 19:51:31
|
显示全部楼层
util.cpp
#include "util.h"
" O5 e: Z* `- K7 j#include <vector>
3 `& r( @) B" z4 q) `
% i6 v9 r( v/ k- lusing namespace std; # @, I n3 c! i5 _( k& ?# S! U: \
, Z. t. x3 P; c/ E, b. Q" N- c# Dchar intToHexChar(int x) {
{7 b. l' |& l6 i4 }& \5 l static const char HEX[16] = {
/ K- N, S6 P) B* `7 F2 O$ A '0', '1', '2', '3',
. N( n; @2 w. C+ \4 z$ s6 v '4', '5', '6', '7', ; u' P7 D7 k& i2 W5 v3 B
'8', '9', 'A', 'B',
7 }7 G& \" i/ q: r0 B" g& A 'C', 'D', 'E', 'F'
& H7 n8 r, a& ^0 t( k }; 2 u7 g( M. t/ a$ x, f/ U
return HEX[x];
9 J5 A0 c7 f4 b/ c- [* O: q} 8 Y4 X( }$ e6 C- }1 x
! h: I7 h4 _& H5 k$ a: o
int hexCharToInt(char hex) {
) |4 j, f4 c# Y& k8 E9 ] hex = toupper(hex);
# s0 H0 F& i. x/ Q. w5 T1 A' j if (isdigit(hex))
" a7 ~% Q0 ^- ^! f return (hex - '0');
" @3 |" `8 e( ^; u% F if (isalpha(hex))
4 N7 b1 g; s9 i6 R3 ^1 b$ u return (hex - 'A' + 10);
- W* z! O' e$ S7 S- j return 0;
0 F# h( {& T+ u. W. a3 \* {6 s}
+ h7 I- R0 B; n9 b% e
' x9 t. h: E) k1 I% Z) T. s7 b8 J" |string bytesToHexString(const byte *in, size_t size) {
3 p, @ S0 S2 R9 w: u/ C8 r4 f' f string str; : ? J* ?! O& m* d; a1 H" _+ c
for (size_t i = 0; i < size; ++i) { 2 @$ G$ g) t: {/ J& a
int t = in[i]; 5 f# t5 F! ?4 V2 N# t
int a = t / 16; , ~: m; S9 f$ C4 z
int b = t % 16;
2 b, O. Q+ w3 `% G6 w, E str.append(1, intToHexChar(a)); 4 d6 I3 P6 p% @& }
str.append(1, intToHexChar(b)); & M; @6 f o+ `7 a8 j, N
if (i != size - 1) ' V- C( m, a! R: ]& F) H
str.append(1, ' '); 4 K, a3 n# H i, Q- a
} . ~8 A, b8 V- S% M: X
return str; # u$ `/ r! K: w0 R) S& k3 u" P
} 9 x' u2 }. P6 m1 H$ Z" }( d* ?
% v q. _' x4 O: S" M. M# g9 N" Jsize_t hexStringToBytes(const string &str, byte *out) { " A( S5 m" w( M1 E
5 A) z3 E P7 E: O4 L8 l
vector<string> vec; 7 x) B; l* K" E. `
string::size_type currPos = 0, prevPos = 0;
) d5 H- s2 ^6 \3 c2 a while ((currPos = str.find(' ', prevPos)) != string::npos) { 2 o+ N# i& M. k/ C% P
string b(str.substr(prevPos, currPos - prevPos));
2 U6 u3 z! J- L1 d vec.push_back(b);
7 s y+ w- v$ M2 J1 ] prevPos = currPos + 1; 3 \. ^+ s. z) O* b+ k! ]' i
}
+ `0 [& x h: a3 d if (prevPos < str.size()) {
. `+ p7 r) C* b8 O string b(str.substr(prevPos));
; |, M4 b, x4 C; { vec.push_back(b);
: C: ?5 p5 D" d. A, M5 r% s" k8 v } # K* b+ `, L- ]* s6 Z
typedef vector<string>::size_type sz_type;
' b, X! v, P/ i) O) E sz_type size = vec.size(); 0 ^8 e/ H5 _; N0 l$ l# W: n9 a! u$ Y4 M
for (sz_type i = 0; i < size; ++i) {
$ P) s! |9 \8 z0 y int a = hexCharToInt(vec[i][0]); . j; V, c% L$ F, ]* N7 t- Z
int b = hexCharToInt(vec[i][1]);
0 W$ d. z. m! M: H: B9 i* d& R! h out[i] = a * 16 + b; 9 o' T* X# s6 H6 T" N8 v
}
$ {* n i, [ H$ z$ n return size;
5 O0 y0 Q! Z! W& M. X} |
|