Binäre Datei Lesen und interpretieren



  • Hallo Leute,

    Ich möchte eine Binäre Datei in C++ öffnen, und dann die verschienden Bytes interpretieren (STL binary format, http://www.ennex.com/~fabbers/StL.asp). Also die Datei im binären Modus zu öffnen und in den speicher zu schreiben gelingt mir, aber dann das anschliessende interpretieren noch nicht ganz.
    also bisher habe ich die datei in einen char* array geschrieben, jedoch habe ich nun noch keinen plan wie ich z.b. floats, unsigned long ints an bestimmten stellen im char* auslesen kann.
    was für funktionen gibt es da? hat da jemand eine idee?

    wäre sehr dankbar, mfg
    level0



  • Folgendes sollte gehen:

    char *bla;
    //füllen
    float f = reinterpret_cast<float>(bla[index]);
    

    Edit: Sorry, da ist was falsch. Siehe Antwort von (D)Evil



  • hallo, danke für den tipp, funktioniert bei mir aber ned, kommt der fehler:

    error C2440: 'reinterpret_cast' : cannot convert from 'char' to 'int'

    any idea?

    thx&greets



  • Hmm ... naja warum du nicht direkt die entsprechenden Daten ausließt, sondern es per char-Array machen willst, ist mir nicht klar, aber okay.

    template<typename value_type>
    value_type convert_raw_data(char* raw_data, const std::size_t index = 0)
    { return *reinterpret_cast<value_type*>(&raw_data[index]); }
    

    so sieht es korrekt aus 😉

    char* data = /* Deine Daten */;
    
    // wenn als 1. ein float drin steht
    float value_first(convert_raw_data<float>(data));
    // danach ein unsigned int
    unsigned int value_second(convert_raw_data<unsigned int>(data, sizeof(float)))
    

    ...



  • danke für die funktion, werde es am abend ausprobieren 🙂
    mfg
    level0



  • hallo leute,

    es scheint mir als wäre die binäre datei in big-endian abgespeichert, gibt es da einen eifachen hack wie man das "umbekehrt" einlesen kann?

    vielen dank!!



  • level0 schrieb:

    ...
    also bisher habe ich die datei in einen char* array geschrieben...
    level0

    hat es einen besonderen grund, das du es in einen char* einliest ?
    wenn ich das richtig sehe, dann haben die facets immer 50 byte.
    du könntest dir zwei strukturen schreiben:

    struct Header
    {
        char header[81];
        unsigned long number_of_facets;
    };
    struct Facet
    {
        float normal_i;
        float normal_j;
        float normal_k;
    
        float vertex1;
        float vertex2;
        float vertex3;    
    // ... usw.
    }
    

    die erste struktur einlesen, number_of_facets * sizeof(struct) byte speicherplatz reservieren und die facet-dingsda in einem rutsch einlesen.
    🙂



  • hey agga ugga!

    gute idee! muss ich gleich probieren 🙂

    ich habe nämlich festgestellt, dass wenn man das gesamte file in ein char oder int oder float array liest, es zu fehlern kommt, weil die binäre datei aus einem mix von den dreien besteht und sobald ein anderer typ als der, des arrays kommt, es irgendwie die gesamte struktur verschiebt und danach nichts brauchbares mehr gelesen werden kann, selbst wenn man die grösse der einzelnen typen berücksichtigt , überspringt und z.b. nur die floats auslesen will.

    habs jetzt relativ schlecht implementiert, und immer diese 12 floats direkt vom file / harddisk gelesen, was natürlich nicht gerade schnell ist.

    mfg



  • soo endlich hab ichs gecheckt...nachdem ich mit #prgama pack(..) gespielt habe und dachte dass da der fehler liegt, dass es meine binäre daten falsch liest, habe ich den fehler noch weiter unten gefunden...
    ich dachte bisher immer dass standard INT 2bytes lang ist, heute wurde ich eines besseren belehrt, sind auf meinem pc 4 bytes, deshalb hat sich die gesamte struktur ständig verschoben...jetz nehm ich halt einen short, der ist zumindest 2 bytes 😉

    thx a lot
    cu


Anmelden zum Antworten