C++ 将std::string转换为uint32\u t

C++ 将std::string转换为uint32\u t,c++,string,uint32-t,C++,String,Uint32 T,我有一个字符串,如下所示: std::string strl="ffffffffffffffffffffffffffffffffffffffffffff"; uint32_t val = std::stoul(strl, nullptr, 16); 我想将其转换为uint32_t变量,如下所示: std::string strl="ffffffffffffffffffffffffffffffffffffffffffff"; uint32_t val = std::stoul(strl, n

我有一个字符串,如下所示:

std::string strl="ffffffffffffffffffffffffffffffffffffffffffff";
uint32_t val = std::stoul(strl, nullptr, 16);
我想将其转换为uint32_t变量,如下所示:

std::string strl="ffffffffffffffffffffffffffffffffffffffffffff";
uint32_t val = std::stoul(strl, nullptr, 16);
上述操作发出一个“SIGABRT”信号并产生错误:

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

为解决此问题需要进行哪些更改,或者uint32数据类型无法存储字符串。

uint32\u t
最多只能存储
0xFFFFFF
,因为它是32位
无符号
类型,所以无法存储该数据类型的字符串

对于当前的字符串,需要一个大的整数库来解析它

Boost有一个很好的版本,甚至包括
typedef
s,比如
uint1024\u t
,所以它的使用非常简单


请参见

如果您确实想将号码存储在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;
    }
}
#包括
#包括
#包括
#包括
自动解析十六进制uint32(标准::字符串常量和输入)->标准::uint32\t
尝试
{
标准::大小读取长度=0;
自动初始结果=标准::stoull(输入和读取长度,16);
if(read_len!=input.size())
{
抛出std::runtime_错误(“无效输入:“+input”);
}
如果(初始结果>标准::数值限制::最大值())
{
抛出std::out_of_范围(“数字太大:+std::to_字符串(初始_结果));
}
返回std::uint32\u t(初始结果);
}
捕获(…)
{
std::throw_与_嵌套(std::runtime_错误(“未能将“+input+”解析为十六进制uint32”);
}
无效打印异常(常量标准::异常&e,整数级别=0)
{

std::cerr每个十六进制数字有四位。字符串指定了多少位?
std::string strl=“0xffffffff”
是您能放入的所有变量名,顺便说一句,这是一个糟糕的变量名(太接近
stol
等等)一个
uint32\u t
中有多少位?这些位需要多少位十六进制数字?您向
std::stoul
提供多少位十六进制数字?还请注意
stoul
中的
l
表示
long
。没有指定
long
的确切位宽,但必须至少为32位,且不大于
long
。因此
long
可能大于
uint32\u t
的32位。