„Dekódování“ reálného čísla z 16 bitové aplikace

Diskobolos

Uf, jsem nucen načítat data z binárních souborů vytvořených ze staré aplikace pro MS DOS/WIN 3.11. Jedna z položek věty je reálné číslo. Kdyby vše bylo v prostředí 32/64 bit, mohu se řídit dle normy IEEE754 (online http://www.binaryconvert.com/result_float.html) a číslo si "zrekonstruuji". Abych to zkrátil - z binárních souborů dokážu vyčíst mantisu, ale nikde nemůžu najít exponent. Jen tak pro zajímavost, uvedu prvních 8 bytů, u terých vím, že se v nich skrývá hodnota (díky tomu ani nemůžu s jistotou říct, že je to float nebo double):
86 00 00 00 00 48 00 00 ... reálné číslo 50
86 CD CC CC CC 44 00 00 ... 49.20
83 48 E1 7A 14 46 00 00 ... 6.19

Kdyby v tom někdo viděl logiku, ať se podělí. Díky.
« Poslední změna: 17. 12. 2014, 14:03:17 od Petr Krčmář »


M.

Re:"Dekódování" reálného čísla z 16bit aplikace
« Odpověď #1 kdy: 17. 12. 2014, 12:55:05 »
Známe - šestibajtový real ze starého dobrého TurboPascalu a odvozenin?
Kód: [Vybrat]
double real48ToDouble(uint8_t realValue[6])
{
double exponent;
double mantissa;
int byte;

if (realValue[0]==0)
return 0.0; /* Null exponent=0 */

exponent=realValue[0]-129.0;
mantissa=0.0;

for (byte=1; byte<=4; byte++) {
mantissa+=realValue[byte];
mantissa*=0.00390625; /* mantissa/=256 */
}
mantissa+=(realValue[5] & 0x7F);
mantissa*=0.0078125; /* mantissa/=128 */
mantissa+=1.0;

if (realValue[5] & 0x80) /* Sign bit check */
mantissa=-mantissa;
return mantissa*pow(2.0, exponent);
}


gamer

Re:"Dekódování" reálného čísla z 16bit aplikace
« Odpověď #2 kdy: 17. 12. 2014, 13:02:28 »
Jako další varianta se nabízí speciální Microsoft formát, používaný starými BASICy:
http://en.wikipedia.org/wiki/Microsoft_Binary_Format
Ověřovat, jestli je to opravdu ono, se mi ale fakt nechce...

Diskobolos

Re:"Dekódování" reálného čísla z 16bit aplikace
« Odpověď #3 kdy: 17. 12. 2014, 13:19:51 »
Známe - šestibajtový real ze starého dobrého TurboPascalu a odvozenin?

Bingo! To je ono. Díky moc!