4 char zu dword



  • wie kann ich 4 chars zu einem dword machen?



  • Kommt auf die Reihenfolge an.
    Vorwärts:

    unsigned long int MeinDWORD;
    unsigned char Char1, Char2, Char3, Char4;
    MeinDWORD = (DWORD)(Char4 << 24) | (Char3 << 16) | (Char2 << 8) | Char1;
    

    Rückwärts:

    unsigned long int MeinDWORD;
    unsigned char Char1, Char2, Char3, Char4;
    MeinDWORD = (DWORD)(Char1 << 24) | (Char2 << 16) | (Char3 << 8) | Char4;
    

    MfG, EOutOfResources

    EDIT: Code-Fix



  • Was soll das genau machen?



  • Wollen wir mal den static_cast spielen lassen! 😃

    dWord = (static_cast<DWORD>(a)<<24) | (static_cast<DWORD>(b)<<16) | (static_cast<DWORD>(c)<<8) | static_cast<DWORD>(d);

    Wobei... wenn char per default signed ist, bei dir, wäre vielleicht der reinterpret_cast wieder angebracht?^^



  • danke eout...

    @Tachyon
    ich habe 4 chars eingelesen (ifstream) und möchte nun einen dword daraus machen



  • EOutOfResources, du meinst wohl eher sowas:

    DWORD dw=(char4<<24)|(char3<<16)|(char2<<8)|(char1);
    

    Deine Variante produziert wohl mehr sowas wie ein Bit-Puzzle. 😉



  • danke decimat

    aber welches soll ich nehmen?



  • der_obernooob schrieb:

    danke decimat

    aber welches soll ich nehmen?

    Meine, die funktioniert wenigstens und enthält keine unnötigen Casts. 😃



  • _matze schrieb:

    EOutOfResources, du meinst wohl eher sowas

    Gefixt. Wie kann ich nur so einen Blödsinn schreiben 🙂



  • A-ha! Bei shift-Operationen muss der Compiler also automatisch auf ein 32bit integer heraufcasten? Bei 64-bit schmeißt mir meiner nämlich um den Kopf, dass die Shift-Operationen undefiniert wären, wenn ich vorher nicht explizit auf größere Typen erweitere.



  • Integral Promotion: Operationen auf kleineren Typen als int haben einen int als Resultat (analog unsigned int ). Und generell nimmt ein arithmetischer Ausdruck immer mindestens den genauesten Typ der Operanden an.

    short a;
    short b;
    // decltype(a + b) == int
    
    int a;
    long b;
    // decltype(a + b) == long
    


  • Das heißt, auf einer Plattform, auf der int jetzt beispielsweise 16 bit hätte, würde ohne meine expliziten casts kein vernünftiges DWORD herauskommen, ja?



  • Decimad schrieb:

    Das heißt, auf einer Plattform, auf der int jetzt beispielsweise 16 bit hätte, würde ohne meine expliziten casts kein vernünftiges DWORD herauskommen, ja?

    Wenn auf der Plattform auch DWORD als unsigned int definiert ist, mach ja ohnehin der Versuch der Zuweisung von 32 Bit keinen Sinn.



  • MSDN schrieb:

    DWORD
    A 32-bit unsigned integer. The range is 0 through 4294967295 decimal.

    Ich ging jetzt vom Microsoft-Typ aus... Ist DWORD anderswo auch so gebräuchlich?



  • Decimad schrieb:

    MSDN schrieb:

    DWORD
    A 32-bit unsigned integer. The range is 0 through 4294967295 decimal.

    Das gilt bei Microsoft so, muss aber nicht überall so sein.

    http://de.wikipedia.org/wiki/Datenwort


Log in to reply