【问题标题】:Convert Hex to Double to Hex?将十六进制转换为双倍到十六进制?
【发布时间】:2013-09-27 02:53:16
【问题描述】:

在我的项目中,我有一个带有十六进制值 (Big Endian) 的 QString

QString hex_in("413DF3EBA463B0");

如何将 hex_in 转换为圆角双精度数? IEEE 754 (https://en.wikipedia.org/wiki/Double_precision_floating-point_format)

34.5

用户将编辑双精度,然后我的程序需要将其转换回十六进制。

感谢您的宝贵时间 :)

【问题讨论】:

  • 十六进制字符串和双精度如何相关?字符串是双精度的二进制内存布局的表示吗?什么编码? IEEE?
  • 抱歉,IEEE 754 造成混淆。字符串是双精度的十六进制表示。
  • 大端还是小端?
  • 其实。我真的很抱歉,这是大端。
  • "413DF3EBA463B0" 只有 14 个字符。您需要另外两个作为双精度的内部表示。哪边?

标签: c++ qt floating-point hex double


【解决方案1】:

实际上只有一种方法可以做到这一点,那就是将字符串转换为整数,将其放入您设置整数成员的union 中并读出double 成员。

对于字符串转换,您可以使用例如one of these functions.


示例代码:

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

    value.i = std::stoll(hexstr, nullptr, 16);

    return value.d;
}

// ...

std::cout << "413DF3EBA463B0 = " << hexstr2double("413DF3EBA463B0") << '\n';

上面代码的输出将是

413DF3EBA463B0 = 1.91824e-307

【讨论】:

  • 我没有将字符串转换为数字,我希望将字符串表示的十六进制转换为数字。除非我误解了你的回答?
  • @mc360pro 但是如果不将字符串转换为那个数字,就无法知道一个字符串可能代表什么数字。
  • 这就是我想要做的。将此十六进制值转换为数字。不会将 JUST 字符串转换为 double 转换 ascii 字符或其他东西,而不是实际的十六进制值的含义吗?
  • @mc360pro 字节交换整数。网上有很多关于如何做到这一点的例子。
  • @mc360pro htonll 会派上用场的。
【解决方案2】:
    double HexToDouble(AnsiString str)
{
  double hx ;
  int nn,r;
  char * ch = str.c_str();
  char * p,pp;
  for (int i = 1; i <= str.Length(); i++)
  {
    r = str.Length() - i;
    pp =   ch[r];
    nn = strtoul(&pp, &p, 16 );
    hx = hx + nn * pow(16 , i-1);
   }
  return hx;
}

我的大十六进制数字函数

结果

72850ccbb88c6226afed9d8d971c8938        -->     1.5222282653101E+38     
000015d85a903c72b6bebdd18fb26811        -->     4.4307191280143E+32

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2020-02-06
    相关资源
    最近更新 更多