diff options
author | erikkay@google.com <erikkay@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-27 16:11:15 +0000 |
---|---|---|
committer | erikkay@google.com <erikkay@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-27 16:11:15 +0000 |
commit | 5d0c17fe26c9ecc7887ae976f6ee1ca7a73642da (patch) | |
tree | da57a5847f6d6ca51766969160ec4215308008c9 /base/string_util.cc | |
parent | d39d60d7205f47ae4e9bb4a6bf0081e54fe2a2e0 (diff) | |
download | chromium_src-5d0c17fe26c9ecc7887ae976f6ee1ca7a73642da.zip chromium_src-5d0c17fe26c9ecc7887ae976f6ee1ca7a73642da.tar.gz chromium_src-5d0c17fe26c9ecc7887ae976f6ee1ca7a73642da.tar.bz2 |
Add HexStringToBytes which takes an arbitrary length hex string and creates a vector of bytes.
Review URL: http://codereview.chromium.org/18814
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@8716 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/string_util.cc')
-rw-r--r-- | base/string_util.cc | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/base/string_util.cc b/base/string_util.cc index 5a06b64..036e61d 100644 --- a/base/string_util.cc +++ b/base/string_util.cc @@ -1409,6 +1409,44 @@ bool HexStringToInt(const std::wstring& input, int* output) { input, reinterpret_cast<long*>(output)); } +template<class CHAR> +bool HexDigitToIntT(const CHAR digit, uint8* val) { + if (digit >= '0' && digit <= '9') + *val = digit - '0'; + else if (digit >= 'a' && digit <= 'f') + *val = 10 + digit - 'a'; + else if (digit >= 'A' && digit <= 'F') + *val = 10 + digit - 'A'; + else + return false; + return true; +} + +template<typename STR> +bool HexStringToBytesT(const STR& input, std::vector<uint8>* output) { + DCHECK(output->size() == 0); + int count = input.size(); + if (count == 0 || (count % 2) != 0) + return false; + for (int i = 0; i < count / 2; ++i) { + uint8 msb = 0; // most significant 4 bits + uint8 lsb = 0; // least significant 4 bits + if (!HexDigitToIntT(input[i * 2], &msb) || + !HexDigitToIntT(input[i * 2 + 1], &lsb)) + return false; + output->push_back((msb << 4) | lsb); + } + return true; +} + +bool HexStringToBytes(const std::string& input, std::vector<uint8>* output) { + return HexStringToBytesT(input, output); +} + +bool HexStringToBytes(const std::wstring& input, std::vector<uint8>* output) { + return HexStringToBytesT(input, output); +} + int StringToInt(const std::string& value) { int result; StringToInt(value, &result); |