Я нашел способ сделать это, который работает на основе динамической природы типа uint128_t.Кажется, он не использует все 16 байтов для числового значения все время.Он использует их только в том случае, если считает, что они необходимы (именно поэтому не работает примитив memcpy ()).
Таким образом, хитрость заключается в том, чтобы заставить его думать, что нужны все 16 байтов, а затем memcpy ()данные в. Мы можем сделать это, установив начальное значение -1 (или все Fs):
boost::multiprecision::uint128_t getUintFromBuffer(const std::vector<unsigned char> &buf)
{
boost::multiprecision::uint128_t retU = -1;
memset(&retU, 0, 16);
memcpy(&retU, buf.data(), std::min(buf.size(), (size_t)16));
return retU;
}
int main()
{
std::vector<unsigned char> buf;
buf.resize(16);
buf[0] = 0xaa;
buf[15] = 0xff;
std::cout << std::hex << getUintFromBuffer(buf) << std::endl;
return EXIT_SUCCESS;
}
Запуск этого примера печатает: FF0000000000000000000000000000AA
И это то, что я былищу:)