diff options
Diffstat (limited to 'src/uint256.cpp')
-rw-r--r-- | src/uint256.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/uint256.cpp b/src/uint256.cpp new file mode 100644 index 0000000000..e513dc1de7 --- /dev/null +++ b/src/uint256.cpp @@ -0,0 +1,79 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2018 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include <uint256.h> + +#include <utilstrencodings.h> + +#include <stdio.h> +#include <string.h> + +template <unsigned int BITS> +base_blob<BITS>::base_blob(const std::vector<unsigned char>& vch) +{ + assert(vch.size() == sizeof(data)); + memcpy(data, vch.data(), sizeof(data)); +} + +template <unsigned int BITS> +std::string base_blob<BITS>::GetHex() const +{ + return HexStr(std::reverse_iterator<const uint8_t*>(data + sizeof(data)), std::reverse_iterator<const uint8_t*>(data)); +} + +template <unsigned int BITS> +void base_blob<BITS>::SetHex(const char* psz) +{ + memset(data, 0, sizeof(data)); + + // skip leading spaces + while (isspace(*psz)) + psz++; + + // skip 0x + if (psz[0] == '0' && tolower(psz[1]) == 'x') + psz += 2; + + // hex string to uint + const char* pbegin = psz; + while (::HexDigit(*psz) != -1) + psz++; + psz--; + unsigned char* p1 = (unsigned char*)data; + unsigned char* pend = p1 + WIDTH; + while (psz >= pbegin && p1 < pend) { + *p1 = ::HexDigit(*psz--); + if (psz >= pbegin) { + *p1 |= ((unsigned char)::HexDigit(*psz--) << 4); + p1++; + } + } +} + +template <unsigned int BITS> +void base_blob<BITS>::SetHex(const std::string& str) +{ + SetHex(str.c_str()); +} + +template <unsigned int BITS> +std::string base_blob<BITS>::ToString() const +{ + return (GetHex()); +} + +// Explicit instantiations for base_blob<160> +template base_blob<160>::base_blob(const std::vector<unsigned char>&); +template std::string base_blob<160>::GetHex() const; +template std::string base_blob<160>::ToString() const; +template void base_blob<160>::SetHex(const char*); +template void base_blob<160>::SetHex(const std::string&); + +// Explicit instantiations for base_blob<256> +template base_blob<256>::base_blob(const std::vector<unsigned char>&); +template std::string base_blob<256>::GetHex() const; +template std::string base_blob<256>::ToString() const; +template void base_blob<256>::SetHex(const char*); +template void base_blob<256>::SetHex(const std::string&); |