【问题标题】:Read from Byte Array and convert to Double从字节数组读取并转换为双精度
【发布时间】:2018-08-08 21:50:06
【问题描述】:

我只是想从一个 BYTE 数组中获取一个 8 BYTE REAL 浮点数,该数组是我之前从文件内容生成的,作为浮点数。

目前我知道 8 BYTE Real 与 double 相同。因此,必须在逻辑上可以读出 8 个字节并将它们直接分配给变量。 不幸的是,它并没有像我想象的那样工作。

作为说明:

My Byte Array 用于控制输出存储在文件中的 HEX 值的数组。

uint64_t result = 0;
for (int i = 0; i < 8; i++){
result = file_buf[content + i];
wsprintf(Outbuf + i*2, L"%02X", result);
OutputMessage(Outbuf, 0);
}

从输出文件中返回正确的十六进制值

C1D6D420937EE766

wsprintf 必须使用它,因为我使用 API 工作并依赖于 whitecharbuffer。

到目前为止,我已经尝试了以下方法:

resdouble =  (double)*&file_buf[content];
swprintf(Outbuf, 200, L" Typ: REAL (8-byte): %Lf\n", resdouble);
OutputMessage(Outbuf, 0);

输出:

Typ: REAL (8-byte): 193,000000

另一个尝试:

result = file_buf[content]<<24;
result = result + (file_buf[content + 1] << 16);
result = result + (file_buf[content + 2] << 8);
result = result + ((file_buf[content + 3]));
result = result << 32;
result = result + (file_buf[content + 4] << 24);
result = result + (file_buf[content + 5] << 16);
result = result + (file_buf[content + 6] << 8);
result = result + (file_buf[content + 7]);

memcpy(&resdouble, &result, 8);
wsprintf(Outbuf, L"HEX Result 8 Byte %16X", resdouble);
OutputMessage(Outbuf, 0);
swprintf(Outbuf, 200, L" Typ: REAL (8-byte): %Lf\n", resdouble);
OutputMessage(Outbuf, 0);

输出:

HEX Result 8 Byte         937EE766
Typ: REAL (8-byte): -1532001869,982873

页面的正确结果: http://www.binaryconvert.com/result_double.html?hexadecimal=C1D6D420937EE766

但必须出来 -1,532002893982。 逗号计算错误。

为什么我会得到错误的双精度数,我该怎么做才能得到 -1,532001 而不是 -1532001869,982873 的结果?

编辑: 我从@Gerhardh 试试这个

(double)(*&file_buf[content]);
resdouble = *(double*)&file_buf[content];
swprintf(Outbuf, 200, L"Typ: REAL:\t%f\n", resdouble);
OutputMessage(Outbuf, 0);
swprintf(Outbuf, 200, L" Typ: HEX (8-byte): %X\n", resdouble);
OutputMessage(Outbuf, 0);

输出:

Typ: REAL:  5111310630843501598.......... 
Datentyp: HEX (8-byte): 20D4D6C1

在第一行使用字节交换

_byteswap_uint64(file_buf[content]);

我有同样的结果。

【问题讨论】:

  • 在循环中:ergebnis = file_buf[inhalt + i]; 只是一遍又一遍地分配给ergebnis。它不会将字节数组转换为双精度。
  • 您可能希望使用英文名称作为标识符。这将使非德语人士更容易理解您的代码。
  • 常见问题解答:What is the strict aliasing rule?.
  • 试试这个:resdouble = (double)*&amp;file_buf[content]; => resdouble = *(double*)&amp;file_buf[content];

标签: c double real-number


【解决方案1】:

您必须将ergebnis 转换为一个字节数组,然后填充每个字节。完成后,您就有了 uint64。例如:

union {
    unsigned char b[8];
    uint64_t d;
} ergebnis;

for (int i = 0; i < 8; i++){
    ergebnis.b[i] = file_buf[inhalt + i];
}
wsprintf(Ausgabebuf + i*2, L"%02X", ergebnis.d);

还要注意系统的“字节顺序”,否则您可能需要反转循环

【讨论】:

  • 感谢您的回答。是的,您的解决方案是 HEX 值控制输出的更好方法。但这不是我的问题,我的问题是 resdouble 中的实际值错误。
猜你喜欢
  • 2021-05-13
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 2010-11-21
  • 2011-02-23
  • 1970-01-01
相关资源
最近更新 更多