Pointer cast problem: von DWORD * nach BYTE *



  • Hi!

    So langsam ist es echt frustrierend. Ich muss eingelesene Daten sowohl als DWORD als auch als BYTE ansprechen. Deshalb wollte ich folgendes machen (vereinfacht):

    1:  DWORD dwBuffer[16];
    2:  PBYTE bBuffer = (BYTE *)dwBuffer;
    3:  dwBuffer[2]= dwFileSizeHi;
    4:  bBuffer[0] = (BYTE)0x80;
    

    Das funktioniert aber nicht. Ich kriege ne access violation at Runtime in Zeile 4.

    Wenn ich die ersten beiden Zeilen wie folgt ändere:

    1:  BYTE bBuffer[64];
    2:  PDWORD dwBuffer = (DWORD *)bBuffer;
    3:  dwBuffer[2]= dwFileSizeHi;
    4:  bBuffer[0] = (BYTE)0x80;
    

    dann funktioniert alles und ich bekomme überall korrekte Werte.

    Warum funktioniert die zweite Version aber nicht die erste? Da DWORD größer als BYTE ist, dachte ich, dass die erste Version laufen sollte und die zweite vielleicht wegen Aligning der Variablen Ärger machen könnte.

    Danke schonmal im Voraus....



  • Also außer daß der Code schmutzig is mit der Low-Level-Casterei seh ich eigentlich keinen Fehler drin (abgesehn von der ungarischen Notation). Bist du sicher, daß es an dem geposteten Ausschnitt liegt und nicht woanders herkommt?



  • Casting... Ich weiss. Brauche ich aber hier, weil ich Datenblöcke zu je 64 Bytes jeweils padden muss (SHA-1 Algorithmus). Außerdem ist die Big nach Little Endian Konvertierung so an einer Stelle leichter.

    Zeile 3 und 4 sind nur als Beispiel gedacht, welche Operationen im dem Programm funktionieren und welche schief gehen. Wie gesagt, ich wollte das hier etwas vereinfacht darstellen....

    Danke aber...



  • Wenn du vielleicht deinen richtigen Code posten würdest (oder etwas mehr davon), könnte man vielleicht einen Fehler erkennen. Weil manchmal liegt der Fehler wo ganz anders als man denkt. Is jedenfalls so meine Erfahrung.



  • Ich habe das ganze Projekt mal hochgeladen (VS.NET 2003, code ist komplett in sha1.c, GUI in resource.rc):

    http://www.stw-bonn.de/~z25525/public/sha1.zip

    Implementiert wird der SHA-1 Algorithmus.

    Die entsprechenden Zeilen sind in OutSHA1Value() (Zeile 104 und Zeile 134). Wenn ich Zeile 104 auskommentiere (entspricht version 2 von oben) und Zeile 106 verwende (entspricht version 1 von oben), dann stopt der Debugger in Zeile 134 mit einer access violation.

    Der komplette code umfasst nur 223 lines (incl Kommentare). Ist insgesamt nicht sehr sauber, aber war eigentlich mehr als proof of concept gedacht.

    Wenn jemand da wirklich reingucken will, dann wär das natürlich toll...



  • Ich habe den Bug gefunden. Er war an anderer Stelle. Der Code oben ist korrekt...

    Danke an alle...



  • DWORD dwBuffer[16];
    PBYTE bBuffer = (BYTE *)dwBuffer;

    Ne du hast hier einen Pointer für den Typ PBYTE auf DWORD, welches ja um einiges
    größer ist.

    BYTE bBuffer[64];
    PDWORD dwBuffer = (DWORD *)bBuffer;

    Hier hast du ja einen Pointer vom Typ PDWORD auf BYTE welches ja kleiner ist.

    Daran liegt es ganz sicher.



  • Sind wir im C++ oder im C-Forum?
    Wofür gibt es reinterpret_cast? 🙄


Anmelden zum Antworten