C++ 在C+中从十六进制字符串到双精度字符串的转换+;

C++ 在C+中从十六进制字符串到双精度字符串的转换+;,c++,hex,double,C++,Hex,Double,我有一个字节中的字符串,它表示一个双精度数字。十六进制格式如下: char buffer[17] = "4053E60C49BA5E35"; 正确值为:21898625。 我需要一个简单的方法将这个字符串转换为双精度。目前唯一有效的方法是这样,但我不确定这是不是最好的方法: double hexstr2double(const std::string& hexstr) { union { long long i; double d; } value

我有一个字节中的字符串,它表示一个双精度数字。十六进制格式如下:

char buffer[17] = "4053E60C49BA5E35";
正确值为:21898625。 我需要一个简单的方法将这个字符串转换为双精度。目前唯一有效的方法是这样,但我不确定这是不是最好的方法:

double hexstr2double(const std::string& hexstr)
{
  union
  {
     long long i;
     double    d;
  } value;

  try{
    value.i = std::stoll(hexstr, nullptr, 16);
  }
  catch(...){value.i=0;}

  return value.d;
}

谢谢

您可以使用reinterpret_cast而不是union。 此外,您在站点上提供的值不同,用于从十六进制转换为双精度:

#包括
使用名称空间std;
双hexstr2double(常量标准::字符串和hexstr)
{
双d=0.0;
试一试{
*重新解释铸件(&d)=标准::斯托尔(hexstr,nullptr,16);
}
捕获(…){}
返回d;
}
int main()
{
字符缓冲区[]=“4035e60c49ba5e35”;

CouthToE调用未定义的行为。您不能访问任何其他的联合成员,而不是您上次写入的那个成员。如果您想将整数转换为字节型的浮点型,则需要“代码> MycPy < /C>”,而不是通过联合来键入双击,因为C++中不允许这样做。您能给我举个例子吗?首先在字符串前面加上“0x”,表示它在16进制。@JesperJuhl--我认为这里的十六进制值是浮点值的位,用十六进制表示。
std::strod
不能处理这个问题。
#include <iostream>

using namespace std;

double hexstr2double(const std::string& hexstr)
{
    double d = 0.0;

    try{
        *reinterpret_cast<unsigned long long*>(&d) = std::stoull(hexstr, nullptr, 16);
    }
    catch(...){}

    return d;
}

int main()
{
    char buffer[] = "4035e60c49ba5e35";
    cout<<sizeof(double)<<" "<<sizeof(unsigned long long)<<endl;
    cout<<hexstr2double(buffer);

    return 0;
}