使用std :: hex将十六进制转换为十进制

时间:2018-06-25 18:46:34

标签: c++ visual-c++

我正在Windows上使用VS 2010。我有一个使用char指针的函数。现在,在函数内部,我正在调用std::hex将其转换为十进制,但是由于某种原因,它无法正常工作。它输出一个很大的值,这使我认为它正在转换地址。

void convertHexToDec(char* hex, char * dec)
{
    long long decimal;
    std::stringstream ss;

    ss << hex;
    ss >> std::hex >> decimal;

    sprintf (dec, "%llu", decimal);
}

因此,如果传入包含char的{​​{1}}指针,则输出的十进制值类似于"58"。看起来它正在转换十六进制的地址。

我也尝试过以下方法:

1D34E78xxxxxxxxx

以上方法均无效。

有什么想法可以使该功能正常工作吗?

2 个答案:

答案 0 :(得分:2)

除了您没有使用std::string和参考外,我还尝试了以下代码:

#include <iostream>
#include <sstream>

void convertHexToDec(char* hex, char* dec)
{
    long long decimal;
    std::stringstream ss;

    ss << hex;
    ss >> std::hex >> decimal;
    std::cout << "Decimal: " << decimal << "\n";

    sprintf (dec, "%llu", decimal);
}

int main()
{
    char hex[] = "58";
    char dec[4];

    convertHexToDec(hex, dec);

    std::cout << "Output string: " << dec << "\n";
}

输出:

Decimal: 88
Output string: 88

live example

那你怎么了?

答案 1 :(得分:2)

错误的原因很可能是错误的printf指定符。此外,sprintf不安全的:它假定目标缓冲区(dec)足够大。

使用函数签名的可能解决方案-不建议使用,因为您不知道目标的大小:

void convertHexToDec( char* hex, char * dec )
{
  std::sprintf( dec, "%lld", std::strtoll( hex, 0, 16 ) );
}

安全的解决方案:

std::string convertHexToDec( const char* h )
{
  return std::to_string( std::strtoll( h, 0, 16 ) );
}

使用流的安全解决方案:

std::string convertHexToDec( const char* h )
{
  long long lld;
  std::istringstream( h ) >> std::hex >> lld;

  std::ostringstream os;
  os << lld;

  return os.str();
}