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

Search the boards