【发布时间】: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。它不会将字节数组转换为双精度。 -
您可能希望使用英文名称作为标识符。这将使非德语人士更容易理解您的代码。
-
试试这个:
resdouble = (double)*&file_buf[content];=>resdouble = *(double*)&file_buf[content];
标签: c double real-number