Как я могу преобразовать массив байтов в boost :: multiprecision :: uint128_t?

Если у меня есть:

char buffer[16];

Как я могу преобразовать его необработанные байты в:

boost::multiprecision::uint128_t ?

Я попытался сделать стандартный бросок в стиле C:

uint128_t myInt = *(uint128_t*)buffer;

хотя это, кажется, не работает должным образом. Также пытался использовать dynamic_cast

Я нашел эту страницу: https://www.boost.org/doc/libs/1_56_0/libs/multiprecision/doc/html/boost_multiprecision/tut/conversions.html

о том, как вести беседы, но, похоже, это не распространяется на подобные вещи. Есть идеи?

РЕДАКТИРОВАТЬ:
В одном из комментариев было предложено использовать memcpy (если он был похож на 128-битный uint GCC) для копирования байтов в uint128_t. Это, кажется, не работает должным образом, если сделано так, как я ожидал:
memcpy () попробуй
Я что-то пропустил?

-1

Решение

Я нашел способ сделать это, который работает на основе динамической природы типа 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

И это то, что я искал 🙂

0

Другие решения

Других решений пока нет …