Zeiger schieben



  • Hallo,

    ich habe ein char Array namens buffer, welches per fopen und fread mit einer Binärdatei gefüllt wird.
    Danach versuche ich aus dem buffer eine Struktur zu extrahieren in dem ich einfach BYTEs, WORDs oder DWORDs auslese. Die filelength wird beim einlesen gleich mitbestimmt.

    int filelength;
    void* dir = this->loadbinfile(filepath, &filelength);
    void* p = dir;
    if(dir == NULL)
    {
        //Error
    }
    
    while((char*)p < (char*)dir + filelength)
    {
         //do something
         DWORD ret = getDWORD(p);    //als Beispiel, es könnte auch getWORD oder getBYTE aufgerufen werden
         //do something more
    }
    

    die getDWORD Methode sieht so aus:

    inline DWORD getDWORD(void* &p)
    {
         DWORD ret_val = *(DWORD*) p;
         //Zeiger weiterschieben
         return ret_val;
    }
    

    Und irgendwie stehe ich jetzt auf dem Schlauch, wie kann ich in der getDWORD Methode den Zeiger p 4Byte weiterschieben ?



  • scrabbl schrieb:

    Und irgendwie stehe ich jetzt auf dem Schlauch, wie kann ich in der getDWORD Methode den Zeiger p 4Byte weiterschieben ?

    Zuerst in DWORD*& casten (Referenz, damit das Original verändert wird) und dann inkrementieren. Ich empfehle übrigens static_cast . 🙂



  • Indem du einfach 4 * sizeof(char) draufaddierst und den Wert in der Referenz auf den Zeiger abspeicherst. Aber ganz im Ernst, das ist echt kein C++ in diesem Sinne, das ging mit den fstreams vollkommen ohne Pointerarithmetik.



  • Hi,

    danke für die Antworten, habs hinbekommen, schaut jetzt so aus:

    p = (DWORD*)((DWORD)p + sizeof(DWORD));
    

    Hab mir den fstream mal angeschaut und muss sagen das ich jetzt über ein Redesign nachdenke .. mein Problem ist wohl das ich aus tieferen Programmierebenen komme und mit Pointerschubsen vertraut bin 🙂
    Was es da so alles an Objekten gibt die das alles schon fast fertig mitbringen weiß ich meistens gar nicht. Aber das sieht wirklich viel angenehmer und vorallem nachvollziehbarer aus.


Anmelden zum Antworten