Changeset View
Changeset View
Standalone View
Standalone View
src/uint256.cpp
Show All 12 Lines | |||||
template <unsigned int BITS> | template <unsigned int BITS> | ||||
base_blob<BITS>::base_blob(const std::vector<uint8_t> &vch) { | base_blob<BITS>::base_blob(const std::vector<uint8_t> &vch) { | ||||
assert(vch.size() == sizeof(data)); | assert(vch.size() == sizeof(data)); | ||||
memcpy(data, &vch[0], sizeof(data)); | memcpy(data, &vch[0], sizeof(data)); | ||||
} | } | ||||
template <unsigned int BITS> std::string base_blob<BITS>::GetHex() const { | template <unsigned int BITS> std::string base_blob<BITS>::GetHex() const { | ||||
char psz[sizeof(data) * 2 + 1]; | char psz[sizeof(data) * 2 + 1]; | ||||
for (unsigned int i = 0; i < sizeof(data); i++) | for (size_t i = 0; i < sizeof(data); i++) { | ||||
sprintf(psz + i * 2, "%02x", data[sizeof(data) - i - 1]); | sprintf(psz + i * 2, "%02x", data[sizeof(data) - i - 1]); | ||||
} | |||||
return std::string(psz, psz + sizeof(data) * 2); | return std::string(psz, psz + sizeof(data) * 2); | ||||
} | } | ||||
template <unsigned int BITS> void base_blob<BITS>::SetHex(const char *psz) { | template <unsigned int BITS> void base_blob<BITS>::SetHex(const char *psz) { | ||||
memset(data, 0, sizeof(data)); | memset(data, 0, sizeof(data)); | ||||
// skip leading spaces | // skip leading spaces | ||||
while (isspace(*psz)) | while (isspace(*psz)) { | ||||
psz++; | psz++; | ||||
} | |||||
// skip 0x | // skip 0x | ||||
if (psz[0] == '0' && tolower(psz[1]) == 'x') psz += 2; | if (psz[0] == '0' && tolower(psz[1]) == 'x') { | ||||
psz += 2; | |||||
} | |||||
// hex string to uint | // hex string to uint | ||||
const char *pbegin = psz; | const char *pbegin = psz; | ||||
while (::HexDigit(*psz) != -1) | while (::HexDigit(*psz) != -1) { | ||||
psz++; | psz++; | ||||
} | |||||
psz--; | psz--; | ||||
uint8_t *p1 = (uint8_t *)data; | uint8_t *p1 = (uint8_t *)data; | ||||
uint8_t *pend = p1 + WIDTH; | uint8_t *pend = p1 + WIDTH; | ||||
while (psz >= pbegin && p1 < pend) { | while (psz >= pbegin && p1 < pend) { | ||||
*p1 = ::HexDigit(*psz--); | *p1 = ::HexDigit(*psz--); | ||||
if (psz >= pbegin) { | if (psz >= pbegin) { | ||||
*p1 |= uint8_t(::HexDigit(*psz--) << 4); | *p1 |= uint8_t(::HexDigit(*psz--) << 4); | ||||
p1++; | p1++; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
template <unsigned int BITS> | template <unsigned int BITS> | ||||
void base_blob<BITS>::SetHex(const std::string &str) { | void base_blob<BITS>::SetHex(const std::string &str) { | ||||
SetHex(str.c_str()); | SetHex(str.c_str()); | ||||
} | } | ||||
template <unsigned int BITS> std::string base_blob<BITS>::ToString() const { | |||||
return (GetHex()); | |||||
} | |||||
// Explicit instantiations for base_blob<160> | // Explicit instantiations for base_blob<160> | ||||
template base_blob<160>::base_blob(const std::vector<uint8_t> &); | template base_blob<160>::base_blob(const std::vector<uint8_t> &); | ||||
template std::string base_blob<160>::GetHex() const; | template std::string base_blob<160>::GetHex() const; | ||||
template std::string base_blob<160>::ToString() const; | template std::string base_blob<160>::ToString() const; | ||||
template void base_blob<160>::SetHex(const char *); | template void base_blob<160>::SetHex(const char *); | ||||
template void base_blob<160>::SetHex(const std::string &); | template void base_blob<160>::SetHex(const std::string &); | ||||
// Explicit instantiations for base_blob<256> | // Explicit instantiations for base_blob<256> | ||||
template base_blob<256>::base_blob(const std::vector<uint8_t> &); | template base_blob<256>::base_blob(const std::vector<uint8_t> &); | ||||
template std::string base_blob<256>::GetHex() const; | template std::string base_blob<256>::GetHex() const; | ||||
template std::string base_blob<256>::ToString() const; | template std::string base_blob<256>::ToString() const; | ||||
template void base_blob<256>::SetHex(const char *); | template void base_blob<256>::SetHex(const char *); | ||||
template void base_blob<256>::SetHex(const std::string &); | template void base_blob<256>::SetHex(const std::string &); |