0

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

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

举例说明:

My Byte Array 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]);

我有同样的结果。

4

1 回答 1

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);

还要注意系统的“字节顺序”,或者您可能必须反转循环

于 2018-08-08T12:45:54.097 回答