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 ...


Anmelden zum Antworten