uint256.cpp raw

   1  // Copyright (c) 2009-2010 Satoshi Nakamoto
   2  // Copyright (c) 2009-2020 The Limenka 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  template <unsigned int BITS>
  11  std::string base_blob<BITS>::GetHex() const
  12  {
  13      uint8_t m_data_rev[WIDTH];
  14      for (int i = 0; i < WIDTH; ++i) {
  15          m_data_rev[i] = m_data[WIDTH - 1 - i];
  16      }
  17      return HexStr(m_data_rev);
  18  }
  19  
  20  template <unsigned int BITS>
  21  void base_blob<BITS>::SetHexDeprecated(const std::string_view str)
  22  {
  23      std::fill(m_data.begin(), m_data.end(), 0);
  24  
  25      const auto trimmed = util::RemovePrefixView(util::TrimStringView(str), "0x");
  26  
  27      // Note: if we are passed a greater number of digits than would fit as bytes
  28      // in m_data, we will be discarding the leftmost ones.
  29      // str="12bc" in a WIDTH=1 m_data => m_data[] == "\0xbc", not "0x12".
  30      size_t digits = 0;
  31      for (const char c : trimmed) {
  32          if (::HexDigit(c) == -1) break;
  33          ++digits;
  34      }
  35      unsigned char* p1 = m_data.data();
  36      unsigned char* pend = p1 + WIDTH;
  37      while (digits > 0 && p1 < pend) {
  38          *p1 = ::HexDigit(trimmed[--digits]);
  39          if (digits > 0) {
  40              *p1 |= ((unsigned char)::HexDigit(trimmed[--digits]) << 4);
  41              p1++;
  42          }
  43      }
  44  }
  45  
  46  template <unsigned int BITS>
  47  std::string base_blob<BITS>::ToString() const
  48  {
  49      return (GetHex());
  50  }
  51  
  52  // Explicit instantiations for base_blob<160>
  53  template std::string base_blob<160>::GetHex() const;
  54  template std::string base_blob<160>::ToString() const;
  55  template void base_blob<160>::SetHexDeprecated(std::string_view);
  56  
  57  // Explicit instantiations for base_blob<256>
  58  template std::string base_blob<256>::GetHex() const;
  59  template std::string base_blob<256>::ToString() const;
  60  template void base_blob<256>::SetHexDeprecated(std::string_view);
  61  
  62  const uint256 uint256::ZERO(0);
  63  const uint256 uint256::ONE(1);
  64