Преобразование шестнадцатеричной строки в double в C ++ - PullRequest
0 голосов
/ 29 марта 2019

У меня есть строка в байтах, представляющая двойное число.В шестнадцатеричном формате это выглядит так:

char buffer[17] = "4053E60C49BA5E35";

В двойном случае правильное значение равно: 21,898625.Мне нужен простой способ конвертировать эту строку в два раза.Единственный способ, который работает только сейчас, это это, но я не уверен, что это лучший способ:

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

Спасибо

1 Ответ

0 голосов
/ 29 марта 2019

Вы можете использовать reinterpret_cast вместо объединения. Кроме того, представленное вами значение отличается на сайте для преобразования из шестнадцатеричного в двойное значение: https://gregstoll.com/~gregstoll/floattohex/

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