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

Using std::hex to convert hex to decimal

本文关键字:转换 十六进制 十进制 std hex 使用      更新时间:2023-10-16

我在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);
}

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

我也尝试了这些方法:

ss << *hex;
ss << (char*)hex[0];
ss << (int *)&hex[0];

以上都不起作用。

知道我怎样才能使这个功能工作吗?

错误的原因可能是错误的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();
}

除了不使用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

现场示例

那么你的问题是什么?