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位。