binär auslesen und zu int Konvertieren



  • hi,

    Ich würd gerne die Breite des PNG-Bildes auslesen.
    Jedoch crasht es bei std::stoi.(invalid_argument exception)
    Wäre nett wenn mir jemand sagt, wie man es richtig macht...
    Mein Versuch war so:

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <iomanip>
    #include <string>
    int main()
    {
    	std::vector<char> buffer(4);
    	std::ifstream file("../Projekt1dadadad/test.png",  std::ios::binary);
    	file.seekg(16, std::ios::beg);
    	file.read(&buffer[0], 4);
    	file.close();
    	std::string s(buffer.begin(),buffer.end());
    
    	int x = std::stoi(s, 0, 16);
    	std::cout << x;
    	std::cin.get();
    	return 0;
    }
    


  • Wenn du binär ausliest hast du doch schon das Int, wieso den Umweg über einen String und wieder zurück? Das Einzige worauf du beim Einlesen von Binärwerten achten solltest, ist ob die Daten im Big- oder Little-Endian Format gespeichert sind.

    Hier sind ein paar Infos drüber: http://libpng.org/pub/png/spec/1.2/PNG-DataRep.html#DR.Integers-and-byte-order



  • Jo ,war i-wie total aufm Holzweg 😃

    So hab ichs gelöst:

    int readBigEndian(std::istream& stream)
    {
    	unsigned char b[4];
    	stream.read((char*)b, 4);
    
    	return static_cast<int>(
    		(b[3]) |
    		(b[2] << 8) |
    		(b[1] << 16) |
    		(b[0] << 24));
    }
    
    std::ifstream file(filepath, std::ios::binary);
    file.seekg(16, file.beg);
    int width = readBigEndian(file);
    

  • Mod

    Der static_cast dort ist überflüssig. Aus gleich zwei Gründen:
    -char-Typen sind sowieso ohne Cast in Integer umwandelbar.
    -Das Ergebnis der Rechnung ist gar kein char, sondern ist bereits ein int! Sonst würde die Rechnung schließlich gar nicht funktionieren, da die Zwischenergebnisse nicht in einen char passen. Berechnungen werden in C++ mindestens mit int durchgeführt, auch (bzw. gerade dann) wenn die beteiligten Datentypen kleiner sind.
    Hier wird beides erklärt.


Anmelden zum Antworten