Чтение из байтового массива и преобразование в двойной
Я просто пытаюсь получить 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);
Также обратите внимание на "порядковый номер" вашей системы, или вам, возможно, придется инвертировать цикл