diff options
| author | Pieter Wuille <[email protected]> | 2012-04-21 16:47:02 -0700 |
|---|---|---|
| committer | Pieter Wuille <[email protected]> | 2012-04-21 16:47:02 -0700 |
| commit | 7dbe393629a263675ccfd6fce8e7fc12496c808a (patch) | |
| tree | 6ebb6e166ec727e08b625d8566cc7368fbaf4320 /src | |
| parent | Merge pull request #1129 from laanwj/2012_04_opcodes (diff) | |
| parent | Integrate @JoelKatz's optimized ToHex (#562) into current HexStr function (diff) | |
| download | discoin-7dbe393629a263675ccfd6fce8e7fc12496c808a.tar.xz discoin-7dbe393629a263675ccfd6fce8e7fc12496c808a.zip | |
Merge pull request #1131 from laanwj/2012_04_hexstr
Integrate @JoelKatz's optimized ToHex (#562) into current HexStr function
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/util_tests.cpp | 11 | ||||
| -rw-r--r-- | src/util.h | 23 |
2 files changed, 25 insertions, 9 deletions
diff --git a/src/test/util_tests.cpp b/src/test/util_tests.cpp index db31f4988..0393edb1a 100644 --- a/src/test/util_tests.cpp +++ b/src/test/util_tests.cpp @@ -88,8 +88,19 @@ BOOST_AUTO_TEST_CASE(util_HexStr) BOOST_CHECK_EQUAL( HexStr(ParseHex_expected, ParseHex_expected + 5, true), "04 67 8a fd b0"); + + BOOST_CHECK_EQUAL( + HexStr(ParseHex_expected, ParseHex_expected, true), + ""); + + std::vector<unsigned char> ParseHex_vec(ParseHex_expected, ParseHex_expected + 5); + + BOOST_CHECK_EQUAL( + HexStr(ParseHex_vec, true), + "04 67 8a fd b0"); } + BOOST_AUTO_TEST_CASE(util_DateTimeStrFormat) { BOOST_CHECK_EQUAL(DateTimeStrFormat("%x %H:%M:%S", 0), "01/01/70 00:00:00"); diff --git a/src/util.h b/src/util.h index d9ec68c62..fe8ca60b4 100644 --- a/src/util.h +++ b/src/util.h @@ -361,15 +361,20 @@ inline int64 abs64(int64 n) template<typename T> std::string HexStr(const T itbegin, const T itend, bool fSpaces=false) { - if (itbegin == itend) - return ""; - const unsigned char* pbegin = (const unsigned char*)&itbegin[0]; - const unsigned char* pend = pbegin + (itend - itbegin) * sizeof(itbegin[0]); - std::string str; - str.reserve((pend-pbegin) * (fSpaces ? 3 : 2)); - for (const unsigned char* p = pbegin; p != pend; p++) - str += strprintf((fSpaces && p != pend-1 ? "%02x " : "%02x"), *p); - return str; + std::vector<char> rv; + static char hexmap[16] = { '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + rv.reserve((itend-itbegin)*3); + for(T it = itbegin; it < itend; ++it) + { + unsigned char val = (unsigned char)(*it); + if(fSpaces && it != itbegin) + rv.push_back(' '); + rv.push_back(hexmap[val>>4]); + rv.push_back(hexmap[val&15]); + } + + return std::string(rv.begin(), rv.end()); } inline std::string HexStr(const std::vector<unsigned char>& vch, bool fSpaces=false) |