我正在编写一个小程序转换字符串的十六进制表示,这是一个提高我技能的kata。
这就是我的想法
std::vector<int> decimal( std::string const & s )
{
auto getint = [](char const k){
switch(k){
case 'f':
return 15;
case 'e':
return 14;
case 'd':
return 13;
case 'c':
return 12;
case 'b':
return 11;
case 'a':
return 10;
case '9':
return 9;
case '8':
return 8;
case '7':
return 7;
case '6':
return 6;
case '5':
return 5;
case '4':
return 4;
case '3':
return 3;
case '2':
return 2;
case '1':
return 1;
case '0':
return 0;
};
std::vector<int> result;
for( auto const & k : s )
{
result.push_back(getint(k));
}
return result;
}
我想知道是否有另外一种方法可以做到这一点。我已经考虑过将某些东西用作std :: map,但我不确定哪一个可能更快。如果还有其他方法,请添加它。
请记住,我这样做是为了提高我的技能和学习代码 - kata。
谢谢,TIA!
答案 0 :(得分:1)
首先,您可以像这样简化逻辑:
auto getint = [](char const k){
if(k >= 'a' && k <= 'f') return (k - 'a');
else if(k >= 'A' && k <= 'F') return (k - 'A');
else if(k >= '0' && k <= '9') return (k - '0');
else return -1;
}
除此之外,可能存在一个标准库函数,它可以完全根据您的具体需求进行操作。
答案 1 :(得分:0)
您可以使用strtol or strtoll来完成从base16字符串转换为整数值的大部分繁重工作。
然后使用stringstream对象转换回常规字符串。
// parse hex string with strtol
long value = ::strtol(s.c_str(), nullptr, 16); //not shown - checking for errors. Read the manual page for more info
// convert value back to base-10 string
std::stringstream st;
st << value;
std::string result = st.str();
return result;
答案 2 :(得分:0)
对于十进制数字,将字符转换为数字非常容易,因为C ++规范说所有数字在所有编码中必须是连续的,'0'
最低,'9'
最高。这意味着您只需减去'0'
即可将字符转换为数字,例如k - '0'
。虽然这些字母没有这样的要求,但最常见的编码(ASCII)也是如此,但如果你想要便携的话,不应该指望它。
您也可以使用例如std::transform
和std::back_inserter
,所以不需要自己的循环。也许像是
std::transform(std::begin(s), std::end(s), std::back_inserter(result), getint);
在getint
功能中,您可以使用,例如std::isxdigit
和std::isdigit
分别检查字符是否为有效的十六进制或十进制数字。您应该使用例如如果十六进制数字为大写,则为std::tolower
。