moeglicherweise zu simpel - aber ich komme nicht drauf



  • gegeben:

    unsigned char buffer [100]
    unsigned short st1 = 0x1234;
    unsigned short st2 = 0x5678;

    frage, wie schaffe ich es, dass folgendes herauskommt ?

    buffer[0] = 0x12;
    buffer[1] = 0x34;
    buffer[2] = 0x56;
    buffer[3] = 0x78;

    habe folgendes probiert, aber das geht nicht:
    (unsigned short) buffer[0] = st1;
    (unsigned short) buffer[sizeof(unsigned short)] = st2;

    ich komme einfach nicht drauf.......



  • Portabel wird es wohl nur so gehen:

    buffer[0] = st1 / 0x100;
    buffer[1] = st1 % 0x100;
    buffer[2] = st2 / 0x100;
    buffer[3] = st2 % 0x100;
    

    Dir schwebte vielleicht so etwas vor:

    *((unsigned short*)&buffer[0]) = st1;
    //...
    

    Das geht aber nur, wenn die verwendete Architektur Big Endian ist.



  • Naja, man koennte sich ja ne kleine Funktion bauen, welche prueft es sich um
    eine Big Endian-Architektur handelt oder nicht und dann entsprechend rechnet.

    Um das zu ueberpruefen, kannst du folgenden Code verwenden:

    //es handelt sich nur um den relervanten codeausschnitt
    //aus dem Buch "Programmieren von Unix-Netzwerken"
    
    union
    {
       short   s;
       char    c[sizeof(short)];
    } un;
    
    un.s = 0x0102;
    
    if(sizeof(short) == 2)
    {
       if(un.c[0] == 1 && un.c[1] == 2)
           //big-endian
       else if(un.c[0] == 2 && un.c[1] == 1)
           //little-endian
       else
           //es gibt auch architekturen, welche
           //anders vorgehen ;)
    }
    else
       //sizeof(short) != 2
    

    mfg
    v R



  • Hi,
    als ich das gelesen hab, hab ich zuerst gedacht, das man das doch mit einer union, lösen könnte oder nicht, also ca. so (hab es jetzt nicht getestet)

    union TEST
    {
       unsigend int Zahl;
       char Zeichen[2]
    };
    
    //und nun irgendwo im Programm
    TEST Test;
    
    Test.Zahl = 0x1234;
    cout << Test.Zeichen[0]; //0x12
    

    Jetzt meine Frage, würd das nciht auch gehen, oder bin ich völlig auf den Holzpfad?

    Mfg
    Viets



  • Viets schrieb:

    Jetzt meine Frage, würd das nciht auch gehen, oder bin ich völlig auf den Holzpfad?

    Auch das ist von Litte/Big Endian abhängig. Dein Programm gibt bei mir 4 aus - das Zeichen mit dem Code 0x34.



  • Ahja, danke für die Aufklärung.

    Anmerkung: Mein Gott bin ich blind virtuell Realisticer hat das doch schon mit der Union gepostet, nur hab ich das wohl übersehen *andieStirnklatsch*

    Mfg
    Viets



  • erstmal danke fuer die antworten.
    in der tat habe/hatte ich 2 probleme:
    1.) die short int in den buffer zu bekommen (da war mein typecast falsch).
    2.) little/big endian da der buffer uebers netzwerk an verschiedene zielsystem geschickt wird, wo die byteorder unterschiedlich sein kann.
    habe deswegen auch mit htons und ntohs experimentiert.

    mein letzter stand: ich definiere selbst in welchem format ich die daten in den buffer lege und schreibe sie dann passend zurueck. wenn es nicht klappt werde wohl nochmal fragen muessen 😉



  • Hallo,

    du brauchst dir eigentlich keine Sorgen machen, denn TCP uebertraegt immer im
    Big Endian-Anordnung (Quelle: Linux/Unix-Systemprogrammierung, S. 857)

    mfg
    v R



  • virtuell Realisticer schrieb:

    du brauchst dir eigentlich keine Sorgen machen, denn TCP uebertraegt immer im
    Big Endian-Anordnung (Quelle: Linux/Unix-Systemprogrammierung, S. 857)

    :-U TCP kümmert sich aber nicht darum, wie du die Daten reintust, wenn du sowas machst

    int abc=0x12345678;
    send(s, (char *)abc, sizeof(abc));
    

    dann ist das TCP ziemlich egal, weil der nur Byteströme bekommt. Wie die INternen Felder von TCP/IP ausgelegt sind, hilft hier jedenfalls nicht.


Anmelden zum Antworten