Erkärung von C Quelltext



  • #define Swap16(s) ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff))
    
    #define Swap32(l) (((l) >> 24) | \
    		   (((l) & 0x00ff0000) >> 8)  | \
    		   (((l) & 0x0000ff00) << 8)  | \
    		   ((l) << 24))
    
    #define Swap16IfLE(s) (*(const char *)&rfbEndianTest ? Swap16(s) : (s))
    
    #define Swap32IfLE(l) (*(const char *)&rfbEndianTest ? Swap32(l) : (l))
    

    Kann mir bitte einer erklären was da gemacht wird 🙂 Danke



  • da wird die 'byte order' von multi-byte werten (long, short usw.) geändert, also die reihenfolge der bytes, in der die werte gespeichert werden. z.b. Swap16IfLE ändert wenn rfbEndianTest!=0 ist. sowas braucht man wenn z.b. wenn ein kommunikationspartner richtig herum (big endian) wörter speichert während der andere es falsch tut (little endian, z.b. intel, == bäh!).



  • kann man denn irgendwie darauf zurückschließen und das falsch gespeicherte als richtig ausgeben?



  • ja rfbEndianTest ist dann nur auf Maschinen true die z.B. little Endian sind und false bei Big Endian Maschinen. Dann wird der wert mit diesem Makro nur bei Little Endian Maschinen geswapped und sonst nicht.



  • Wenn es dir ned klar ist lies mal hier, danach solltest du es checken.

    http://de.wikipedia.org/wiki/Big-endian



  • gnahde schrieb:

    kann man denn irgendwie darauf zurückschließen und das falsch gespeicherte als richtig ausgeben?

    das machen diese makros da oben ja. übrigens ist es schlecht, zur laufzeit die endianess zu detektieren weil die makros dann immer eine verzweigung drin haben und das kann sich negativ auf die performance auswirken. besser:

    #ifdef BRAIN_DAMAGED_CPU
    #define Swap16IfLE(s) Swap16(s)
    #else
    #define Swap16IfLE(s) (s)
    #endif
    

Anmelden zum Antworten