从字节数组读取并转换为Double

时间:2018-08-08 12:34:10

标签: c double real-number

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

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

作为说明:

我的字节数组,用于控制文件中存储的十六进制值的输出。

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

_byteswap_uint64(file_buf[content]);

我有相同的结果。

1 个答案:

答案 0 :(得分: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);

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