Как преобразовать массив байтов в boost :: multiprecision :: uint128_t? - PullRequest
0 голосов
/ 24 октября 2018

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

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() try Я что-то упустил?

1 Ответ

0 голосов
/ 24 октября 2018

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

И это то, что я былищу:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...