|
|
发表于 2010-1-19 19:51:31
|
显示全部楼层
util.cpp
#include "util.h"
2 r9 w3 I# d$ F; q5 H#include <vector> ; d* n% x- p5 J$ k- R
; `% k2 H: m% }6 R3 b. m4 x5 ^( x
using namespace std; $ b7 T1 A( y8 p0 Y1 F X
! }# ?# i' f& {, Gchar intToHexChar(int x) {
8 z, L$ i2 e8 X5 _ static const char HEX[16] = { & k( r- H* m, D, Q
'0', '1', '2', '3', ' T) Z; y, @ \: k7 V
'4', '5', '6', '7', . Y) K/ J( N) a2 n$ p
'8', '9', 'A', 'B',
, _+ C7 k6 _4 y3 ~8 G6 N& M0 d 'C', 'D', 'E', 'F' 5 z5 ?( T- L f& c: w1 H7 N
}; 4 [% V8 Q) O: t0 w3 {, S
return HEX[x]; . n* q! K3 }4 D
} ) V& s" E; t# F" @" \, v
6 T" m: P9 Q1 H9 E" f, P
int hexCharToInt(char hex) {
( W! D! m, F2 [! g8 I8 `! n6 t, Z hex = toupper(hex);
2 x! P Q" O; s/ ^; q; c& Z if (isdigit(hex)) 5 F Z8 y1 i' B7 b+ b
return (hex - '0');
6 |5 X( k6 Z- Z: K, V4 B; u6 g* Z8 r if (isalpha(hex)) ( a, X2 B, q' t D
return (hex - 'A' + 10);
* m" a9 Y5 A1 j1 w1 R: C return 0; # D* L! b2 U+ s
}
z: h% x: W4 v, s1 p$ a# S 1 d" c$ q/ a' `3 O5 p1 l) |$ D8 C
string bytesToHexString(const byte *in, size_t size) {
8 n3 Q. [1 L" z5 Q e4 Z8 _+ N string str;
8 i& I# l8 t' A# p2 W for (size_t i = 0; i < size; ++i) {
+ u/ @) v! K9 y& A# @ int t = in[i];
+ h0 f: ~ k7 o int a = t / 16; - K, S& W [: y; N% e
int b = t % 16;
( ?5 p( v% P- j8 i+ K& B str.append(1, intToHexChar(a)); 2 B" e5 E8 V2 f- r3 A4 p+ `4 A. ~
str.append(1, intToHexChar(b)); ) L) |( @5 i o
if (i != size - 1) ! A& B, [" x( u3 X/ l3 s# A
str.append(1, ' '); ' M4 T# C9 G& d) J1 [& J& J
}
. T8 i2 m% W: n' }9 n. | b return str; D% X4 l5 r6 K. P
} 4 Y* v$ l/ Z" B; @0 T# d* i, }, C
$ M: G s4 z1 c' t5 esize_t hexStringToBytes(const string &str, byte *out) { " y& A! h5 F8 q& h: z, [2 c
0 t3 u4 U3 a9 z! K
vector<string> vec; 9 @6 s9 d" A' P$ i+ l$ V" L4 T; b
string::size_type currPos = 0, prevPos = 0;
! z& w, g, D. x5 m while ((currPos = str.find(' ', prevPos)) != string::npos) { ) L% B0 a$ \. y- c) z4 d+ `. `- B
string b(str.substr(prevPos, currPos - prevPos)); 4 o. ~" H" \# C8 d+ U
vec.push_back(b);
; _7 x$ ^6 r6 Q5 |( A; \: }% Z x prevPos = currPos + 1; . G4 ^ m* ~7 {. h
}
. H0 s) Q6 x$ y. l4 B7 B/ n" d if (prevPos < str.size()) {
# [5 L4 A& n e0 U j) m string b(str.substr(prevPos));
/ g: F" c4 v- K$ S0 X' ` vec.push_back(b); , E: L, |2 C# T. V
} 3 Q3 Y7 `9 C4 Y" `6 T9 F4 H. P
typedef vector<string>::size_type sz_type; / y4 u1 t! ^8 c# m( ^4 ~$ T7 S0 p7 }
sz_type size = vec.size(); 8 A4 Q4 h: P! ~* {
for (sz_type i = 0; i < size; ++i) {
/ l2 z: n. o' g. ?9 \6 s int a = hexCharToInt(vec[i][0]); % V& f1 g6 P; P' G3 O
int b = hexCharToInt(vec[i][1]);
$ F, ?) V, O) P: i out[i] = a * 16 + b; ! p6 a) C5 ]; z8 z) x
} 7 L9 v! _6 \1 G# [+ B n% D
return size; 8 }& w4 `9 F. M1 I; I1 x
} |
|