Einlesen von 2 Bytes in eine short-Variable
-
Moin!
ich bin gerade dabei eine TGA-Ladefunktion zu entwickeln und habe folgendes Problem: Um die Breite und die Höhe des Bildes zu erhalten, müsste ich rein theoretisch mit read() 2 Bytes in eine short-Variable einlesen. Da man aber mit read() so weit ich weiß nur char-Arrays einlesen kann, hab ich mir überlegt, das es doch sicher möglich ist, die beiden Bytes einfach in ein 2 byte langes Array zu laden, und dann einfach "aneinanderzuhängen", so das dies sich einer short-Variablen zuweisen lässt
Wie geht das?mfg
Cortex
-
Wie würde denn der Aufruf aussehen wenn Du das in ein char [2] lesen möchtest?
Und da dann die Adresse von short einfach nach char * casten ?!
-
Sowas?
char c[2]; short s; s = (short(c[0])<<8) && short(c[1])
-
nutzt man read, geht es aber direkt so:
short i; foo.read(reinterpret_cast<short>(i), 2);
soweit ich weiß
-
Nicht ganz:
short i; foo.read(reinterpret_cast<char*>(&i), 2);
Aber wenn man sowas macht, sollte man die Endianess seines Systems beachten.
-
Taurin schrieb:
Sowas?
char c[2]; short s; s = (short(c[0])<<8) && short(c[1])
ööhm könntest du mir die Syntax vom ersten Element dieser logischen Verknüpfung erklären? Aber um deine Frage zu beantworten: so ähnlich meinte ich es.
Aber mein Dank geht auch an Mis2com und Gunnar. Ich probier beides mal aus
-
verdammt ...
ich hab beides mal probiert, aber keines von beiden baut mir die beiden Bytes zu den Zahlen zusammen, die ich erwartet hätte (die Abmessungen des TGA-Bildes)
Ich poste mal meinen Code hier, da ich irgendwie nicht weiterkomme.GLubyte * LadeTGA(const char* dateiname) { char IDlength; char ColorMapType; char ImageType; char * ColorMapSpec = new char[5]; short int tgaX0; short int tgaY0; short int tgaBreite; short int tgaHoehe; char * ImageSpecification = new char[10]; GLubyte bitsPerPixel; GLubyte ImageDescriptor; GLubyte * image = NULL; int imageSize; ifstream target(dateiname, ios_base::binary); target.seekg(ios_base::beg); target.read(&IDlength, 1); target.read(&ColorMapType, 1); target.read(&ImageType, 1); target.read(ColorMapSpec, 5); target.read(reinterpret_cast<char*>(&tgaX0), 2); std::cout<<tgaX0<<std::endl; target.read(reinterpret_cast<char*>(&tgaY0), 2); std::cout<<tgaY0<<std::endl; target.read(reinterpret_cast<char*>(&tgaBreite), 2); std::cout<<tgaBreite<<std::endl; target.read(reinterpret_cast<char*>(&tgaHoehe), 2); std::cout<<tgaHoehe<<std::endl; target.read(&ImageDescriptor, 1); /* target.read(ImageSpecification, 10); std::cout<<ImageSpecification[5]<<" "<<ImageSpecification[6]<<std::endl; tgaBreite = (ImageSpecification[5]<<8) & ImageSpecification[6]; std::cout<<ImageSpecification[7]<<" "<<ImageSpecification[8]<<std::endl; tgaHoehe = (ImageSpecification[7]<<8) & ImageSpecification[8]; ImageDescriptor = ImageSpecification[9]; */ // Auswertung zu TrueColor // Color Map Type Image Type if (ColorMapType == 0 && ImageType == 2) { target.ignore(IDlength); imageSize = tgaBreite*tgaHoehe; image = new GLubyte[imageSize*((int)bitsPerPixel/8)]; target.read((char*)image, imageSize); return image; } // Auswertung zu Pseudo- oder DirectColor return NULL; }
bei der reinterpret_cast-Sache ist es so, das Breite und Höhe beides als 4 angegeben wird, und bei der anderen Sache ist es beidesmal 0. Alle anderen TGA-Header-Größen werden offenbar richtig ausgegeben. Dabei hat das Bild, was die Funktion in meinem Programm lädt 1024x1024 Pixel ...