Skip to content

src/base/mp_utils.cpp

Namespaces

Name
sgns
sgns::base
sgns::base::detail

Functions

Name
template <size_t size,typename uint >
std::array< uint8_t, size >
uint_to_bytes(uint && i)
template <size_t size,typename uint >
uint
bytes_to_uint(gsl::span< uint8_t, size > bytes)
std::array< uint8_t, 8 > uint64_t_to_bytes(uint64_t number)
uint64_t bytes_to_uint64_t(gsl::span< uint8_t, 8 > bytes)
std::array< uint8_t, 16 > uint128_t_to_bytes(const boost::multiprecision::uint128_t & i)
boost::multiprecision::uint128_t bytes_to_uint128_t(gsl::span< uint8_t, 16 > bytes)
std::array< uint8_t, 32 > uint256_t_to_bytes(const boost::multiprecision::uint256_t & i)
boost::multiprecision::uint256_t bytes_to_uint256_t(gsl::span< uint8_t, 32 > bytes)

Functions Documentation

function uint_to_bytes

template <size_t size,
typename uint >
std::array< uint8_t, size > uint_to_bytes(
    uint && i
)

function bytes_to_uint

template <size_t size,
typename uint >
uint bytes_to_uint(
    gsl::span< uint8_t, size > bytes
)

function uint64_t_to_bytes

std::array< uint8_t, 8 > uint64_t_to_bytes(
    uint64_t number
)

function bytes_to_uint64_t

uint64_t bytes_to_uint64_t(
    gsl::span< uint8_t, 8 > bytes
)

function uint128_t_to_bytes

std::array< uint8_t, 16 > uint128_t_to_bytes(
    const boost::multiprecision::uint128_t & i
)

function bytes_to_uint128_t

boost::multiprecision::uint128_t bytes_to_uint128_t(
    gsl::span< uint8_t, 16 > bytes
)

function uint256_t_to_bytes

std::array< uint8_t, 32 > uint256_t_to_bytes(
    const boost::multiprecision::uint256_t & i
)

function bytes_to_uint256_t

boost::multiprecision::uint256_t bytes_to_uint256_t(
    gsl::span< uint8_t, 32 > bytes
)

Source code

#include "base/mp_utils.hpp"

#include <gsl/gsl_util>

namespace sgns::base {

  namespace detail {
    template <size_t size, typename uint>
    std::array<uint8_t, size> uint_to_bytes(uint &&i) {
      std::array<uint8_t, size> res {};
      res.fill(0);
      export_bits(i, res.begin(), 8, false);
      return res;
    }

    template <size_t size, typename uint>
    uint bytes_to_uint(gsl::span<uint8_t, size> bytes) {
      if (bytes.empty()) {
        return uint(0);
      }
      uint result;
      import_bits(result, bytes.begin(), bytes.end(), 8, false);
      return result;
    }
  }  // namespace detail

  std::array<uint8_t, 8> uint64_t_to_bytes(uint64_t number) {
    std::array<uint8_t, 8> result{};
    for (auto i = 0; i < 8; ++i) {
      gsl::at(result, i) = static_cast<uint8_t>((number >> 8 * (7 - i)) & 0xFF);
    }
    return result;
  }

  uint64_t bytes_to_uint64_t(gsl::span<uint8_t, 8> bytes) {
    uint64_t result{0};
    for (auto i = 0; i < 8; ++i) {
      result |= static_cast<uint64_t>(bytes[i]) << (i * 8);
    }
    return result;
  }

  std::array<uint8_t, 16> uint128_t_to_bytes(
      const boost::multiprecision::uint128_t &i) {
    return detail::uint_to_bytes<16>(i);
  }

  boost::multiprecision::uint128_t bytes_to_uint128_t(
      gsl::span<uint8_t, 16> bytes) {
    return detail::bytes_to_uint<16, boost::multiprecision::uint128_t>(bytes);
  }

  std::array<uint8_t, 32> uint256_t_to_bytes(
      const boost::multiprecision::uint256_t &i) {
    return detail::uint_to_bytes<32>(i);
  }

  boost::multiprecision::uint256_t bytes_to_uint256_t(
      gsl::span<uint8_t, 32> bytes) {
    return detail::bytes_to_uint<32, boost::multiprecision::uint256_t>(bytes);
  }

}  // namespace sgns::base

Updated on 2026-03-04 at 13:10:44 -0800