prob mit dem lesen von Daten aus einer Datei



  • Tachchen Leute !

    Ich möchte gerne eine PNG-Grafik Datei öffenen. Dazu habe ich schon eine Seite im Netz gefunden in der das Format also der Dateiaufbau erklärt wird.
    (Verweis: http://i31www.ira.uka.de/docs/mm+ep/02_PNG/main_html.html)

    Kurzer Hinweis:
    Die ersten 8 Bytes einer PNG Datei die sog. Signatur lauten immer 137 80 78 71 13 10 26 10
    Danach kommt der erste Chunk:
    4 byte integer --> Länge der Daten im chunk
    4 byte integer --> Typ des Chunks (als char interpretier der Name)
    Daten des Chunks....

    Allerdings habe ich Probleme mit dem einlesen der Daten.
    Ich habe zwei Bilder mit gimp erstellt. Erstens ist bei mir der erste Wert der Signatur nicht 137 sondern -119 ?? zweitens erhalte ich bei der Größe der Daten immer den Wert 218103808. Wenn ich die Daten des Chunks selbst lese dann kommen ähnliche Werte zustande. Der Name/Typ wird jedoch korrekt dargestellt.
    Das Problem scheint auch unabhängig von der PNG Datei zu sein.

    Hier der Code den ich geschrieben habe, sollte ohne Probs unter jedem Linux kompilierbar sein:

    #include <iostream.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string>
    
    void showPNGData(const char* filename);
    
    int main( int argc, const char* argv[] ) {
                    if(argc > 1)   {
                        showPNGData(argv[1]);
                        exit(0);
                    } else {
                        cout << "Bitte gültige .png Datei als Parameter angeben.\n";
                        exit(0);
                    }
    } //end main
    
    void showPNGData(const char* filename) {
    
            char* png = ".png\0";
            char* PNG = ".PNG\0";
    
            if(strstr(filename , png) || strstr(filename, PNG) ) {
                    cout << "Gültige " << filename << "\n" ;
            }       else {
                    cout << "Ungültige Datei angegeben.\n";
                    exit(0);
            }
    
            FILE* pngFile = fopen(filename, "r");
    
            //Signatur einlesen
            char* signature = new char[8];
            fread(signature, 1, 8 , pngFile);
    
            cout << "PNG Datei Signatur: ";
            for(int i = 0; i < 8; i++)
                cout << (int) signature[i] << " ";
    
            //ersten chunk einlesen
            //erster Teil Länge des Chunks 4 Byte unsigned Integer (nach Spezifikation)
            unsigned int length = 0;
            fread(&length, 4, 1, pngFile);
            cout << "\nLänge des ersten Chunks: " << length << "\n"; // hier wird immer 218103808 ausgegeben 
    
            //zweiter Teil Typ/Name des Chunks
            char* type = new char[4];
            fread(type, 1, 4 , pngFile);
    
            cout << "Chunk type/name : ";
            for(int i = 0; i < 4 ; i++)
                cout << type[i];
    
            cout << "\n";
            fclose(pngFile);
    
    }
    


  • tomatotom schrieb:

    Erstens ist bei mir der erste Wert der Signatur nicht 137 sondern -119 ??

    Das ist ein signed/unsigned Problem:

    static_cast<unsigned char>(137)==static_cast<unsigned char>(-119)
    


  • Kannst Du das bitte ein bißchen genauer erklären ? Thx.



  • iss okay das mit dem unsigned char hat sich geregelt. Danke. Allerdings weiß ich immer noch nicht warum die Integer falsch geleesen werden.


Anmelden zum Antworten