如果我不知道字符串有多大,我如何将二进制/十六进制字符串转换为整数?
我想要atoi
/ atol
做什么,但我不知道要输出什么,因为我不知道该值是32位还是64位。此外,atoi
不会执行十六进制,因此101
将变为101
而不是0x101==257
。
我假设我需要使用template<typename T>
,但是如何创建要在函数中输出的变量? T varname
可以是任何东西,那么是什么使varname
成为一个数字而不是一个指向某个随机位置的指针?
答案 0 :(得分:3)
模板是编译时的东西。您无法在运行时选择数据类型。如果输入值不超过64位类型的范围,则只需使用64位类型。
进行转换的一种方式(但绝不是唯一的方法)如下:
template <typename T>
T hex_to_int(const std::string &str)
{
T x;
std::stringstream(str) >> std::hex >> x;
return x;
}
std::string str = "DEADBEEF"; // hex string
uint64_t x = hex_to_int<uint64_t>(str);
std::cout << x << std::endl; // "3735928559"
答案 1 :(得分:2)
你只需要定义一个bigInt类,然后将你的字符串解析成该类;像这堂课一样:https://mattmccutchen.net/bigint/
答案 2 :(得分:0)
也许就像未经测试的那样:
int // or int64 or whatever you decide on
hexstr2bin ( char *s ) { // *s must be upper case
int result = 0; // same type as the type of the function
while ( *char ) {
result <<= 16;
if ( *char ) <= '9' {
result += *char & 0xF;
}
else {
result = ( *char & 0xF ) + 9;
}
}
return result;
}