Codekata将数字从十六进制转换为十进制整数表示形式

Codekata to convert number from hex to dec integer representation

本文关键字:整数 十进制 表示 转换 数字 十六进制 Codekata      更新时间:2023-10-16

我正在编写一个小程序来转换字符串的十六进制表示,这是一个提高我技能的卡塔。

这就是我提出的

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,但我不确定哪一个可能更快。如果有其他方法可以做到这一点,请添加它。

请记住,我这样做是为了提高我的技能和学习。

感谢TIA!

首先,您可能可以简化您的逻辑,如下所示:

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;
}

除此之外,可能还有一个标准库函数可以做到这一点,根据您的具体需求,您可能更喜欢它。

对于十进制数字,很容易将字符转换为其数字,因为C++规范规定所有编码中的所有数字都必须连续,'0'最低,'9'最高。这意味着您可以通过减去'0'将字符转换为数字,例如k - '0'。虽然对字母没有这样的要求,但最常见的编码(ASCII)也是如此,但如果你想便携,就不应该指望它。

您也可以使用例如std::transformstd::back_inserter来完成,因此不需要自己的循环。也许类似

std::transform(std::begin(s), std::end(s), std::back_inserter(result), getint);

getint函数中,您可以使用例如std::isxdigitstd::isdigit来分别检查字符是有效的十六进制数字还是十进制数字。如果十六进制数字是大写,您可能应该使用例如std::tolower

您可以使用strtol或strtoll来完成从base16字符串转换为整数值的大部分繁重工作。

然后使用字符串流对象将其转换回常规字符串。

// 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;