Branch data Line data Source code
# 1 : : // Copyright (c) 2009-2010 Satoshi Nakamoto # 2 : : // Copyright (c) 2009-2019 The Bitcoin Core developers # 3 : : // Distributed under the MIT software license, see the accompanying # 4 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php. # 5 : : # 6 : : #include <uint256.h> # 7 : : # 8 : : #include <util/strencodings.h> # 9 : : # 10 : : #include <string.h> # 11 : : # 12 : : template <unsigned int BITS> # 13 : : base_blob<BITS>::base_blob(const std::vector<unsigned char>& vch) # 14 : 2031916 : { # 15 : 2031916 : assert(vch.size() == sizeof(m_data)); # 16 : 2031916 : memcpy(m_data, vch.data(), sizeof(m_data)); # 17 : 2031916 : } # 18 : : # 19 : : template <unsigned int BITS> # 20 : : std::string base_blob<BITS>::GetHex() const # 21 : 5559354 : { # 22 : 5559354 : uint8_t m_data_rev[WIDTH]; # 23 : 183439913 : for (int i = 0; i < WIDTH; ++i) { # 24 : 177880559 : m_data_rev[i] = m_data[WIDTH - 1 - i]; # 25 : 177880559 : } # 26 : 5559354 : return HexStr(m_data_rev); # 27 : 5559354 : } # 28 : : # 29 : : template <unsigned int BITS> # 30 : : void base_blob<BITS>::SetHex(const char* psz) # 31 : 109912 : { # 32 : 109912 : memset(m_data, 0, sizeof(m_data)); # 33 : : # 34 : : // skip leading spaces # 35 : 109930 : while (IsSpace(*psz)) # 36 : 18 : psz++; # 37 : : # 38 : : // skip 0x # 39 : 109912 : if (psz[0] == '0' && ToLower(psz[1]) == 'x') # 40 : 68675 : psz += 2; # 41 : : # 42 : : // hex string to uint # 43 : 109912 : size_t digits = 0; # 44 : 6882054 : while (::HexDigit(psz[digits]) != -1) # 45 : 6772142 : digits++; # 46 : 109912 : unsigned char* p1 = (unsigned char*)m_data; # 47 : 109912 : unsigned char* pend = p1 + WIDTH; # 48 : 3495965 : while (digits > 0 && p1 < pend) { # 49 : 3386053 : *p1 = ::HexDigit(psz[--digits]); # 50 : 3386053 : if (digits > 0) { # 51 : 3386041 : *p1 |= ((unsigned char)::HexDigit(psz[--digits]) << 4); # 52 : 3386041 : p1++; # 53 : 3386041 : } # 54 : 3386053 : } # 55 : 109912 : } # 56 : : # 57 : : template <unsigned int BITS> # 58 : : void base_blob<BITS>::SetHex(const std::string& str) # 59 : 21030 : { # 60 : 21030 : SetHex(str.c_str()); # 61 : 21030 : } # 62 : : # 63 : : template <unsigned int BITS> # 64 : : std::string base_blob<BITS>::ToString() const # 65 : 5431800 : { # 66 : 5431800 : return (GetHex()); # 67 : 5431800 : } # 68 : : # 69 : : // Explicit instantiations for base_blob<160> # 70 : : template base_blob<160>::base_blob(const std::vector<unsigned char>&); # 71 : : template std::string base_blob<160>::GetHex() const; # 72 : : template std::string base_blob<160>::ToString() const; # 73 : : template void base_blob<160>::SetHex(const char*); # 74 : : template void base_blob<160>::SetHex(const std::string&); # 75 : : # 76 : : // Explicit instantiations for base_blob<256> # 77 : : template base_blob<256>::base_blob(const std::vector<unsigned char>&); # 78 : : template std::string base_blob<256>::GetHex() const; # 79 : : template std::string base_blob<256>::ToString() const; # 80 : : template void base_blob<256>::SetHex(const char*); # 81 : : template void base_blob<256>::SetHex(const std::string&); # 82 : : # 83 : : const uint256 uint256::ZERO(0); # 84 : : const uint256 uint256::ONE(1);