Wie richtig casten



  • Ok, ich habe einen buffer mit folgendem Inhalt

    \x00\x01\x02\x03\x04\x05\x06\x07\x09\x0a\x0b\x0c\x0d\x0e\x0f
    

    der buffer ist ein pointer auf char (char *buffer) und wurde mit malloc auf Grösse 16 erzeugt und korrekt gefüllt (überprüft durch dump in Datei).
    Meine Fragen nun wir muss ich casten wenn ich weiß der Buffer ist folgendermasen aufgebaut
    WORD, WORD, DWORD, DWORD, DWORD

    und ich möchte die Werte einlesen wie muss in nun buffer casten? Also sowas

    WORD     a,b;
    DWORD    c,d,e;
    
    a = (WORD)*(buffer);
    b = (WORD)*(buffer+2);
    c = (DWORD)*(buffer+4);
    b = (DWORD)*(buffer+8);
    d = (DWORD)*(buffer+12);
    

    Ich häng da jetz schon eine ganze Zeit lang dran aber ich bekomme es nicht hin.
    😞



  • ^^wenn dann so etwa: WORD a = (WORD)(buffer+x);
    aber das kann voll daneben gehen. besser du shiftest und oderst dir die werte zusammen.
    🙂



  • +fricky schrieb:

    ^^wenn dann so etwa: WORD a = (WORD)(buffer+x);
    aber das kann voll daneben gehen. besser du shiftest und oderst dir die werte zusammen.
    🙂

    Ähm ja so gehts, aber warum kann das daneben gehen? Kannst du mir bitte ein Beispiel für das ?Shiften? geben?



  • Renee schrieb:

    Ähm ja so gehts, aber warum kann das daneben gehen?

    z.b. könnte passieren, dass ein 'WORD' von einer ungeraden adresse gelesen wird. manche CPUs mögen sowas gar nicht: -> bus error und absturz.

    Renee schrieb:

    Kannst du mir bitte ein Beispiel für das ?Shiften? geben?

    z.b so (big endian, 16-bit wert aus 'nem 8-bit array holen)

    WORD a = *(buffer + x);  // high byte holen 
    a = a<<8 | *(buffer + x + 1); // hi byte nach ganz links und low byte dazu
    

    🙂



  • Danke für den weiter führenden Hinweis. Ich habs jetzt so gemacht, weil irgendwie hat die Reihenfolge nicht gestimmt, wenn ich das Word in eine Datei gedumpt habe. Ist doch auch ok oder? Ist was mit dem big und little Endian Ding nicht war? Hab da mal bei Wikipedia nachgeschaut, sollt für Windows mit little Endian dann auch ok sein.

    WORD GetWord(u_char *buffer){
    
    	WORD	x;
    
    	x = *buffer;
    	x |= *(buffer + 1) << 8;
    	return x;
    }
    

Anmelden zum Antworten