【问题标题】:Convert 8 bytes to double value [duplicate]将 8 个字节转换为双精度值 [重复]
【发布时间】:2015-07-19 01:02:59
【问题描述】:

我从套接字读取了一些十六进制数据。这个协议的规范告诉我,下面的 8 个字节代表一个双值。

所以我有例如 8 个字节,例如:

0x3F 0xD1 0x9B 0x94 0xC0 0x00 0x00 0x00

(这个值保存在一个char数组中所以Array[0] = 0x3F, `Array[1] = 0xD1è...)

表示的double值是:0.275120913982

如何将这 8 个字节转换为这个双精度值?

我尝试了很多不同的方法,但都没有真正奏效。所以我不知道如何将它操纵成双倍。

【问题讨论】:

  • 您是否检查过是否需要执行大端到小端的转换?
  • “我尝试了很多不同的东西,但都没有真正的效果。所以我不知道如何将它操纵成双倍。” - 这是预期的这样您就可以向我们展示您尝试过的内容,并实际解释发生了什么以及它是如何不起作用的,以及您不理解的原因。无论如何,这很容易:double d; memcpy(&d, &a[0], sizeof d);

标签: c++ arrays double converter


【解决方案1】:

你可以使用联合,这对我有用:

#include <iostream>
using namespace std;

int main() {
    union { char b[8]; double d; };
    b[7] = 0x3F;
    b[6] = 0xD1;
    b[5] = 0x9B;
    b[4] = 0x94;
    b[3] = 0xC0;
    b[2] = 0x00;
    b[1] = 0x00;
    b[0] = 0x00;

    cout << "Double: " << d << endl;

    return 0;
}

请注意字节的倒序。这取决于字节顺序,并且可能因您的机器而异。无论如何它会输出:

Double: 0.275121

【讨论】:

  • 关于类型双关语的常用限定符在这里适用,因为他指定了一个 C++ 标记。
猜你喜欢
  • 2014-11-24
  • 1970-01-01
  • 2017-10-06
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
相关资源
最近更新 更多