diff options
| author | Remko Tronçon <git@el-tramo.be> | 2013-04-18 18:59:27 (GMT) | 
|---|---|---|
| committer | Remko Tronçon <git@el-tramo.be> | 2013-04-18 18:59:27 (GMT) | 
| commit | 2a1b34a623e6e4f28481400637a3a99d5f7adc53 (patch) | |
| tree | 3551707b5193277520c4b2e5c2b149596e25182b | |
| parent | 006cf01bc9c50fa500ebf1dbc562a36daf40cb84 (diff) | |
| download | swift-2a1b34a623e6e4f28481400637a3a99d5f7adc53.zip swift-2a1b34a623e6e4f28481400637a3a99d5f7adc53.tar.bz2 | |
Implemented different hexify.
Change-Id: Iad114775661f5f8f11070acf203c559cbf69fade
| -rw-r--r-- | Swiften/StringCodecs/Hexify.cpp | 41 | 
1 files changed, 30 insertions, 11 deletions
| diff --git a/Swiften/StringCodecs/Hexify.cpp b/Swiften/StringCodecs/Hexify.cpp index 0e6dc4e..ed2b2a3 100644 --- a/Swiften/StringCodecs/Hexify.cpp +++ b/Swiften/StringCodecs/Hexify.cpp @@ -33,20 +33,39 @@ std::string Hexify::hexify(const ByteArray& data) {  	return std::string(result.str());  } -ByteArray Hexify::unhexify(const std::string& hexstring) { -	if (hexstring.size() % 2) { + +static const unsigned char map[256] = { +	255, 255, 255, 255, 255, 255, 255, 255, +	255, 255, 255, 255, 255, 255, 255, 255, +	255, 255, 255, 255, 255, 255, 255, 255,  +	255, 255, 255, 255, 255, 255, 255, 255, +	255, 255, 255, 255, 255, 255, 255, 255, +	255, 255, 255, 255, 255, 255, 255, 255, +	0,   1,   2,   3,   4,   5,   6,   7, +	8,   9,   255, 255, 255, 255, 255, 255, +	255, 10,  11,  12,  13,  14,  15,  255, +	255, 255, 255, 255, 255, 255, 255, 255, +	255, 255, 255, 255, 255, 255, 255, 255, +	255, 255, 255, 255, 255, 255, 255, 255, +	255, 10,  11,  12,  13,  14,  15,  255, +	255, 255, 255, 255, 255, 255, 255, 255, +	255, 255, 255, 255, 255, 255, 255, 255, +	255, 255, 255, 255, 255, 255, 255, 255 +}; + +ByteArray Hexify::unhexify(const std::string& in) { +	if (in.size() % 2) {  		return ByteArray();  	} -	ByteArray result = ByteArray(hexstring.size() / 2); -	for (size_t pos = 0; pos < hexstring.size() - 1; pos += 2) { -		char c; -		c = hexstring[pos]; -		int a = (c>='0'&&c<='9') ? c-'0' : (c>='A'&&c<='Z') ? c-'A' + 10 : (c>='a'&&c<='z') ? c-'a' + 10 : -1; -		c = hexstring[pos+1]; -		int b = (c>='0'&&c<='9') ? c-'0' : (c>='A'&&c<='Z') ? c-'A' + 10 : (c>='a'&&c<='z') ? c-'a' + 10 : -1; -		if (a == -1 || b == -1) return ByteArray(); // fail -		result[pos/2] = (a<<4) | b; +	ByteArray result(in.size() / 2); +	for (size_t pos = 0; pos < in.size() - 1; pos += 2) { +		unsigned char a = map[static_cast<size_t>(in[pos])]; +		unsigned char b = map[static_cast<size_t>(in[pos+1])]; +		if (a == 255 || b == 255) { +			return ByteArray(); +		} +		result[pos/2] = (a<<4) | b;  	}  	return result;  } | 
 Swift
 Swift