Branch data Line data Source code
# 1 : : // Copyright (c) 2009-2010 Satoshi Nakamoto # 2 : : // Copyright (c) 2009-2020 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 : 2835447 : { # 15 : 2835447 : assert(vch.size() == sizeof(m_data)); # 16 : 0 : memcpy(m_data, vch.data(), sizeof(m_data)); # 17 : 2835447 : } # 18 : : # 19 : : template <unsigned int BITS> # 20 : : std::string base_blob<BITS>::GetHex() const # 21 : 1507415 : { # 22 : 1507415 : uint8_t m_data_rev[WIDTH]; # 23 [ + + ][ + + ]: 49725745 : for (int i = 0; i < WIDTH; ++i) { # 24 : 48218330 : m_data_rev[i] = m_data[WIDTH - 1 - i]; # 25 : 48218330 : } # 26 : 1507415 : return HexStr(m_data_rev); # 27 : 1507415 : } # 28 : : # 29 : : template <unsigned int BITS> # 30 : : void base_blob<BITS>::SetHex(const char* psz) # 31 : 129416 : { # 32 : 129416 : memset(m_data, 0, sizeof(m_data)); # 33 : : # 34 : : // skip leading spaces # 35 [ + + ][ + + ]: 129434 : while (IsSpace(*psz)) # 36 : 18 : psz++; # 37 : : # 38 : : // skip 0x # 39 [ + + ][ + + ]: 129416 : if (psz[0] == '0' && ToLower(psz[1]) == 'x') # [ + + ][ + + ] # 40 : 83103 : psz += 2; # 41 : : # 42 : : // hex string to uint # 43 : 129416 : size_t digits = 0; # 44 [ + + ][ + + ]: 8409594 : while (::HexDigit(psz[digits]) != -1) # 45 : 8280178 : digits++; # 46 : 129416 : unsigned char* p1 = (unsigned char*)m_data; # 47 : 129416 : unsigned char* pend = p1 + WIDTH; # 48 [ + + ][ + + ]: 4269487 : while (digits > 0 && p1 < pend) { # [ + + ][ + - ] # 49 : 4140071 : *p1 = ::HexDigit(psz[--digits]); # 50 [ + - ][ + + ]: 4140071 : if (digits > 0) { # 51 : 4140059 : *p1 |= ((unsigned char)::HexDigit(psz[--digits]) << 4); # 52 : 4140059 : p1++; # 53 : 4140059 : } # 54 : 4140071 : } # 55 : 129416 : } # 56 : : # 57 : : template <unsigned int BITS> # 58 : : void base_blob<BITS>::SetHex(const std::string& str) # 59 : 23346 : { # 60 : 23346 : SetHex(str.c_str()); # 61 : 23346 : } # 62 : : # 63 : : template <unsigned int BITS> # 64 : : std::string base_blob<BITS>::ToString() const # 65 : 1342312 : { # 66 : 1342312 : return (GetHex()); # 67 : 1342312 : } # 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);