Posted By: Quasimodo (Quasimodo) on 'CZprogram'
Title: Pokud nejaky javista nema co delat...
Date: Thu Nov 18 16:17:58 2004
Pokud na to spravne koukam, tak v jave neexistuje neco takoveho jako union a
pointery jsou neco, ceho se strasne moc chteli zbavit. Vzpomnel jsem si na
jeden problem, kdyz jsem v C++ potreboval nacist ze souboru vytvoreneho
pascalem hodnoty typu float... Jak by se neco takoveho delalo v jave nebo
podobnych jazycich, kde nemam ani union ani pouzitelne pointery? Pripada mi,
ze to musi byt peknej porod... Nebo se pletu?
Moje reseni v C++ sice krasou neoplyva, ale dostatecne (rychle) funguje pro
data, se kterymi ma pracovat:
#define unsigned char byte
/// Pro snadny pristup k jednotlivym bytum pouziju union
union cfloat
{
byte bajt[4];
float value;
cfloat &operator = (float f)
{
value = f; return *this;
}
};
/** Pascalsky real zabira v pameti 6B. Tato trida umoznuje konverze mezi
timto formatem a std C++ floatem na 4B
Pozor na endian! Tohle je psano a odzkouseno pro intel!
*/
struct pasfloat
{
byte bajt[6];
pasfloat &operator=(float f)
{
cfloat cf;
cf = f;
*this = cf;
return *this;
};
/// Prevod z ceckovskeho floatu
pasfloat &operator=(cfloat cf)
{
bajt[0] = (cf.bajt[3] & 0x7f)*2 + ((cf.bajt[2] & 0x80) >> 7) + 2;
bajt[1] = 0;
bajt[2] = 0;
bajt[3] = cf.bajt[0];
bajt[4] = cf.bajt[1];
bajt[5] = cf.bajt[2] & (0x7f);
// Znamenko
bajt[5] |= cf.bajt[3] & 0x80;
return *this;
};
/// Prevod na ceckovsky float (fuj - az nekdy bude cas, predelat)
operator float()
{
float f = pow (2, bajt[0] - 129) * (
bajt[1] * pow (2, -63) +
bajt[2] * pow (2, -31) +
bajt[3] * pow (2, -23) +
bajt[4] * pow (2, -15) +
(bajt[5] & 0x7f )* pow (2, -7) + 1);
if (bajt[5] & 0x80)
f = -f;
return f;
};
};
Pouzivam to obvykle ve tvaru
pasfloat pf;
read(fd, &pf, sizeof(pf));
-
Clovek je nejpomalejsi zname zarizeni typu I/O.
Quasimodo