Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » unsigned Integer aus einer Datei einlesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.11.2004, 13:03 Uhr
~tommes
Gast


hI !
Ich bin gerade ein Programm am schreiben, um eine PNG Datei zu öffnen. Leider scheitert es schon beim einlesen der Daten. Allerdings liegt es eher daran dass ich C++ wohl flasch benutze.

Ich möchte eine unsigned int aus einer PNG Datei lesen. Das mache ich wie folgt:


C++:
        //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 << "Länge der Daten im Chunk: " << length << "\n";



Das Problem ist, daß ich immer den Wert "Länge der Daten im Chunk: 218103808" als Ausgabe erhalte, egal welche PNG Datei ich einlesel. Das gleich passiert mit anderen Integerwerten die ich auslese. Lese ich zB einen Integerwert der Länge 1 Byte ein wie zB:


C++:
        int depth = 0;
        fread(&depth, 1, 1 , pngFile);
        cout << "Farbtiefe: " << depth << "\n";



dann wird der richtige Wert ausgegeben. Hier ist der komplette Quellcode:


C++:
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <string>

void showPNGData(const char* filename);
int check(const unsigned char* signature);

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) {


        FILE* pngFile = fopen(filename, "r");

        //Signatur einlesen
        unsigned char* signature = new unsigned char[8];
        fread(signature, 1, 8 , pngFile);

        cout << "PNG Datei Signatur: ";
        for(int i = 0; i < 8; i++)
            cout << (int) signature[i] << " ";
        cout << "\n";

        //checken ob der Benutzer überhaupt eine gültige png Datei öffnen möchte
        if( check(signature) == -1 ) {
            cout << "Keine gültige png Datei angegeben.\n";
            exit(0);
        }

        //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 << "Länge der Daten im Chunk: " << length << "\n";

        //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";

        unsigned int width = 0;
        fread(&width, 4, 1, pngFile);
        cout << "Breite des Bildes: " << width << "\n";


        fseek(pngFile, 4, SEEK_CUR);

        int depth = 0;
        fread(&depth, 1, 1 , pngFile);
        cout << "Farbtiefe: " << depth << "\n";

        int colorType = 0;
        fread(&colorType, 1 ,1 , pngFile);
        cout << "Farbtyp: " << colorType << "\n";

        fclose(pngFile);
}// end showPNGData

int check(const unsigned char* signature) {
    unsigned char checkSignature[] = { (unsigned char)137, (unsigned char)80, (unsigned char)78, (unsigned char)71, (unsigned char)13, (unsigned char)10, (unsigned char)26, (unsigned char)10 };

    for(int i = 0; i < 8; i++)
        if(signature[i] != checkSignature[i])
            return -1;

    return 0;
}




Ich fände es ganz nett, wenn einer mal kurz diese Programm auf seiner Maschine compilieren würde und meinen Fehler bestätigen kann. Weil ich absolut keine Idee mehr habe was hier flasch läuft. Danke !

tom

PNg Datei Spezifikation (spez Chunk Layout): www.w3.org/TR/PNG/#5Chunk-layout
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.11.2004, 15:06 Uhr
virtual
Sexiest Bit alive
(Operator)


Vermutlich liegt in der PNG der 4-Byte integer in Networkbyte order vor, Du musst es also noch in HostByte Order umwandeln, also zB ntohl vertwenden,
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.11.2004, 16:03 Uhr
~tommes
Gast


krass alter! auf den Kram muss man erstmal kommen. Super geil vielen Dank das war, jetzt klappts.

Tom
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: