Byteorder und so...



  • Hey!

    Ich frage mich immer, ob das was ich tue auch plattformunabhängig ist...
    Was muss man genau beachten? Wann wird zB. ein Zeiger-cast plattformABhängig?
    Sind Bitoperatoren plattformunabhängig? Immer?
    Muss man sonst was außer byte-order beachten?

    zB.

    unsigned char bytes[] = { 7, 1 };
    unsigned short *word = (unsigned short*)&bytes;
    

    Auf meiner little-endian Maschine ist *word gleich 263. Auf einer big-endian wäre es dann 1793, also wie als ob ich oben mit 1, 7 initialisiert hätte?
    Das ist "byte-order", richtig?

    Hab da nie so richtig durchgeblickt...

    😕 😕 😕



  • Unwissender04 schrieb:

    Hey!

    Ich frage mich immer, ob das was ich tue auch plattformunabhängig ist...
    Was muss man genau beachten? Wann wird zB. ein Zeiger-cast plattformABhängig?
    Sind Bitoperatoren plattformunabhängig? Immer?
    Muss man sonst was außer byte-order beachten?

    zB.

    unsigned char bytes[] = { 7, 1 };
    unsigned short *word = (unsigned short*)&bytes;
    

    Auf meiner little-endian Maschine ist *word gleich 263. Auf einer big-endian wäre es dann 1793, also wie als ob ich oben mit 1, 7 initialisiert hätte?
    Das ist "byte-order", richtig?

    Richtig !

    Und Bitoperatoren sind plattformunabhängig - Immer!

    mfg



  • Aha, und wie macht das zB. das WinAPI?
    Da wird doch wildestens rumgecastet, egal welche App immer brauche ich reinterpret_cast und nicht wenige davon...

    😕



  • 😕



  • Dass du reinterpret_cast brauchst, und vor allem so häufig, deutet eher auf Design-Probleme hin. Davon abgesehen ist die Win-API eben für Windows - und damit ist die Plattformunabhängigkeit ja sowieso schon über den Jordan. Die PC-Systeme auf denen Widows läuft sind allesamt little-endian-Systeme.



  • Im WinAPI gehts nunmal oft nicht ohne reinterpret_cast<>... C-Style casts verwende ich natürlich nicht...
    Aber dass Windows nur auf little-endian Systemen läuft, wusste ich nicht.

    Danke und bin für weitere Hinweise dankbar!
    MfG



  • Bei Netzwerkgeschichten kann man auch, wenn man nicht gerade Massendaten verschickt sondern z.B. nur Kontrollparameter/Kommandos, alles über Strings lösen. Die sind ebenfalls Plattformunabhänig.
    Es gibt auch noch fortschrittlichere Techniken für die Serialisierung. boost.serialization ist z.B. so eine Technik.
    Bei Corba wird IDL benutzt, wo man Schnittstellen in einer plattformunabhängigen Sprache (eben IDL) beschreibt, und man daraus dann jeweils konkreten Code für die jeweilige Plattform erzeugt. IDL lässt sich auch losgelöst von Corba verwenden.



  • Dass man für WinAPI hin und wieder (dauernd ist übertrieben) einen reinterpret_cast braucht liegt wohl daran dass es sich (grösstenteils) um eine reine C-API handelt.

    @Unwissender04:
    Dein Code hat ein Problem, und zwar dass char und short unterschiedliche Alignment-Anforderungen haben könnten. Es ist nicht garantiert dass du einen char* auf einen short* casten kannst (und den dann dereferenzieren). Umgekehrt schon, also von T* auf char* ist OK.


Anmelden zum Antworten