fstream ein Byte auslesen und als short zurück geben



  • Hi zusammen eigentlich kein Thema und gleich vorweg, ja ich hab die FAQ gelesen aber es klappt dennoch nicht so wie ich es möchte. Ich habe es für mehrere Bytes so:(das klappt Prima)

    unsigned long laenge = to_Byte - from_Byte+1;
    		if (from_Byte > to_Byte)
    			return FALSE;
    		// Puffer anlegen und Datei einlesen. 
    		char* pBuffer = new char[laenge]; //Göße des Puffers
    		Wavefile.seekg(from_Byte); //geh an die Startposition
    		Wavefile.read(pBuffer, laenge); //einlesen (binär)
    		pData = new unsigned long[laenge+1]; //neuen Puffer für Int Werte
    		pData[0] = from_Byte; //um zu wissen welcher Wert welchem Byte entspricht
    		for (unsigned long i=1; i<laenge;i++) // Byteweise Binär nach int konvertierung
    		{ 
    			pData[i] = (short)(unsigned char)pBuffer[i-1]; 
    		} 
    		// Nachher wieder aufräumen. 
    		delete [] pBuffer;
    		return TRUE;
    

    jetzt wollte ich das vereinfachen (evtl wegen Performance, Speicher auslastung oder so) denn ich denke dass ich nicht so eine große Funktion brauche um ein lächerliches Byte auszulesen.
    Dann hab ich es so versucht: (klappt leider nicht)

    char* Bytewert = new char [1]; //muss das unbedingt ein array sein geht da nicht ein einzelner character?
    	short Byte_dezimal = -1;
    	Wavefile.seekg(Byte); //geh an die Startposition
    	Wavefile.read(Bytewert, 1); //einlesen (binär)
    	Byte_dezimal = (short)(char)Bytewert;// wandeln in short
    	return Byte_dezimal;
    

    P.S.: Wavefile ist fstream

    Wenn ich das File nun so auslese bekomme immer andere Werte! Ich hab mir noch ein tellg eingebaut und bekomm nach meinem seekg auch tatsächlich mein Byte das ich übergeben hab wieder woran liegt das??



  • mach mal ein

    Byte_dezimal = (short)(unsigned char)Bytewert;// wandeln in short
    

    drus, vielleicht klappts dann?

    (und nein, bei einem einzelnen Element im char* brauchst du keinen array draus machen)



  • Da Bytewert ein Zeiger ist musst Du den dereferenzieren um den Inhalt zu bekommen, sonst wandelt er das low-Byte der Adresse um.

    Byte_dezimal = (short)*Bytewert;// wandeln in short
    

    Und nein, das muß kein Array sein, nichtmal ein new, im zweiten Code hättest Du sonst eh ein Leak gehabt:

    char Bytewert;
        Wavefile.seekg(Byte);
        Wavefile.read(&Bytewert, 1); // hier jetzt die Adresse von Bytewert!!!
        return (short)Bytewert;;
    


  • pumuckl schrieb:

    mach mal ein

    Byte_dezimal = (short)(unsigned char)Bytewert;// wandeln in short
    

    drus, vielleicht klappts dann?

    Nein leider nicht immernoch gleiches! Beim testen hab ich bekommen 64 dann 112 dann hab ich aufgehört eigentlich wäre da die 16 richtig 😞

    pumuckl schrieb:

    (und nein, bei einem einzelnen Element im char* brauchst du keinen array draus machen)

    Wie geht es dann?? Ich hatte:

    char* Bytewert =NULL;
    

    aber da ist er mit einer unhandled exception ausgestiegen1



  • Polofreak schrieb:

    pumuckl schrieb:

    (und nein, bei einem einzelnen Element im char* brauchst du keinen array draus machen)

    Wie geht es dann?? Ich hatte:

    char* Bytewert =NULL;
    

    aber da ist er mit einer unhandled exception ausgestiegen1

    Wie es geht steht im Beitrag über deinem bereits.



  • vonUnterwegs schrieb:

    ...

    char Bytewert;
        Wavefile.seekg(Byte);
        Wavefile.read(&Bytewert, 1); // hier jetzt die Adresse von Bytewert!!!
        return (short)Bytewert;;
    

    Das klappt einwandfrei! TipTop! VIELEN DANK an euch alle

    @HumeSikkins: Danke für deinen Post, hab auf Antwort gewartet obwohl sie schon drüber stand! 🙄



  • noch ein kleiner Nachtrag falls jemand mal das gleiche machen will. Die erste Zeile abändern auf unsigned char ansonsten gibts Probleme wenn man über 128 raus kommt.
    Aber dann wirklich TIP TOP!
    Danke nochmals


Anmelden zum Antworten