将Double转换为十六进制字符串

Convert Double to Hex String?

本文关键字:十六进制 字符串 转换 Double      更新时间:2023-10-16

在我的项目中,我读取一个双变量作为十六进制并将其加载到字符串中。

我需要将十六进制字符串转换为双精度数。我现在使用这个:

double hexstr2double(const std::string& hexstr)
{
    union
    {
        long long i;
        double    d;
    } value;
    value.i = std::stoll(hexstr, nullptr, 16);
    return value.d;
}

当我这样做时:

qDebug() << hexstr2double("402540798D23092A");

输出为10.6259。不是很准确,但我觉得很好。

然后用户可以将该数字编辑为他们想要的任何数字。我如何将它们的数字转换回十六进制表示?

感谢您的宝贵时间。

虽然sstream是一个很好的答案…这里有一些关于在多线程程序中使用流的问题。

与snprintf:

类似的解决方案
#include <iostream>
#include <cstdio>
double hexstr2double(const std::string& hexstr)
{
    union
    {
        long long i;
        double    d;
    } value;
    value.i = std::stoll(hexstr, nullptr, 16);
    return value.d;
}
std::string double2hexstr(double x) {
    union
    {
        long long i;
        double    d;
    } value;
   value.d = x;
   char buf[17];
   snprintf (buf,sizeof(buf),"%016llx",value.i);
   buf[16]=0; //make sure it is null terminated.
   return std::string(buf);
}
int main(int argc,char **argv) {
 double a=3.141592;
 std::string x=double2hexstr(a);
 double b=hexstr2double(x);
 std::cout << a << std::endl;
 std::cout << x << std::endl;
 std::cout << b << std::endl;
 return 0;
}

编辑(使用std::ostringstream的替代版本)

#include <iostream>
#include <sstream>
#include <iomanip>
double hexstr2double(const std::string& hexstr)
{
    union
    {
        long long i;
        double    d;
    } value;
    value.i = std::stoll(hexstr, nullptr, 16);
    return value.d;
}
std::string double2hexstr(double x) {
    union
    {
        long long i;
        double    d;
    } value;
   value.d = x;
   std::ostringstream buf;
   buf << std::hex << std::setfill('0') << std::setw(16) << value.i;
   return buf.str();
}
int main(int argc,char **argv) {
 double a=3.141592;
 std::string x=double2hexstr(a);
 double b=hexstr2double(x);
 std::cout << a << std::endl;
 std::cout << x << std::endl;
 std::cout << b << std::endl;
 return 0;
}

注意……我并不是说std::ostringstream不起作用。它在内存安全方面当然有更好的属性(就像snprintf比sprintf有更好的属性一样)…但是要注意,在多线程程序中(至少在某些STL实现中)可能会导致过度锁定。

当您像这样使用union时,请注意不可移植(不符合c++标准)

有一个很好的讨论:CppCon 2019: Timur Doumler"现代c++中的类型双关语"

一个符合的解决方案可以是:

#include <iostream>
#include <cstdio>
#include <cstdint>
#include <cstring>
double hexstr2double(const std::string& hexstr) {
    uint64_t i = std::stoll(hexstr, nullptr, 16);
    double d;
    std::memcpy(&d,&i,8);
    return d;
}
std::string double2hexstr(double x) {
   uint64_t i;
   std::memcpy(&i,&x,8);
   char buf[17];
   snprintf (buf,sizeof(buf),"%016llx",i);
   buf[16]=0; //make sure it is null terminated.
   return std::string(buf);
}
int main(int argc,char **argv) {
 double a=3.141592;
 std::string x=double2hexstr(a);
 double b=hexstr2double(x);
 std::cout << a << std::endl;
 std::cout << x << std::endl;
 std::cout << b << std::endl;
 return 0;
}