Чтение из байтового массива и преобразование в двойной

Я просто пытаюсь получить 8-байтовое РЕАЛЬНОЕ число с плавающей точкой из массива BYTE, который я ранее сгенерировал из содержимого файла, как число с плавающей точкой.

На данный момент я знаю, что 8-байтовый реал такой же, как двойной. Следовательно, должно быть логически возможно считывать 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);

Outpout:

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?

РЕДАКТИРОВАТЬ: я пытаюсь это от @ Герхард

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

У меня такой же результат.

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

Также обратите внимание на "порядковый номер" вашей системы, или вам, возможно, придется инвертировать цикл

Другие вопросы по тегам