Преобразование std :: string в uint32_t

У меня есть строка, как показано ниже:

std::string strl="ffffffffffffffffffffffffffffffffffffffffffff";

Я хочу преобразовать его в переменную uint32_t, как показано ниже:

uint32_t val = std::stoul(strl, nullptr, 16);

Вышеуказанная операция дает «SIGABRT» сигнализирует и выдает ошибку:

terminate called after throwing an instance of 'std::out_of_range'
what():  stoul.

Какие изменения нужно сделать для решения проблемы или невозможно с типом данных uint32_t сохранить строку.

-2

Решение

uint32_t может хранить только до 0xffffffff как это 32 бит unsigned тип, поэтому невозможно сохранить вашу строку с этим типом данных.

Для строки, которую вы представляете, вам понадобится большая целочисленная библиотека для ее анализа.

Boost имеет хороший, и даже включает в себя typedefкак uint1024_t, так что это очень просто в использовании.

Увидеть http://www.boost.org/doc/libs/1_58_0/libs/multiprecision/doc/html/index.html

2

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

Если вы действительно хотите сохранить число в uint32_t, вам необходимо его проверить.

Я бы подошел к этому примерно так:

#include <string>
#include <cstdint>
#include <stdexcept>
#include <iostream>

auto parse_hex_uint32(std::string const& input) -> std::uint32_t
try
{
std::size_t read_len = 0;

auto initial_result = std::stoull(input, &read_len, 16);
if (read_len != input.size())
{
throw std::runtime_error("invalid input: " + input);
}
if (initial_result > std::numeric_limits<std::uint32_t>::max())
{
throw std::out_of_range("number too large: " + std::to_string(initial_result));
}

return std::uint32_t(initial_result);
}
catch(...)
{
std::throw_with_nested(std::runtime_error("failed to parse " + input + " as hex uint32"));
}

void print_exception(const std::exception& e, int level =  0)
{
std::cerr << std::string(level, ' ') << "exception: " << e.what() << '\n';
try {
std::rethrow_if_nested(e);
} catch(const std::exception& e) {
print_exception(e, level+1);
} catch(...) {}
}

int main()
{
using namespace std::literals;
auto input = "ffffffffffffffff"s;
try
{
std::cout << parse_hex_uint32(input) << std::endl;
return 0;
}
catch(std::exception& e)
{
print_exception(e);
return 100;
}
}
1

По вопросам рекламы [email protected]