Swapping 64Bit Zahl



  • Hallo, ich habe folgende Funktion geschrieben zum Swappen einer 64 unsigned integer Zahl:

    unsigned __int64 swap ( unsigned __int64 value)
      {
         unsigned __int64 b1 = (value >>  0) & 0xff;
         unsigned __int64 b2 = (value >>  8) & 0xff;
         unsigned __int64 b3 = (value >> 16) & 0xff;
         unsigned __int64 b4 = (value >> 24) & 0xff;
         unsigned __int64 b5 = (value >> 32) & 0xff;
         unsigned __int64 b6 = (value >> 40) & 0xff;
         unsigned __int64 b7 = (value >> 48) & 0xff;
         unsigned __int64 b8 = (value >> 56) & 0xff;
    
        return b1 << 56 | b2 << 48 | b3 << 40 | b4 << 32 |
               b5 << 24 | b6 << 16 | b7 <<  8 | b8 <<  0;
      }
    

    Ihr übergebe ich 0xd2dd0000 und als Ergebnis erhalte ich 0xDDD200000000 Aber wenn ich die Bytes swappe, dann sollte doch eigentlich was anderes rauskommen oder?

    Übergeben: 0xDD2D --> 1101110100101101
    Ergebnis: 0xDDD200000000 -->110111011101001000000000000000000000000000000000
    Erwartet: 0xBB4B -> 1011101101001011



  • ^^such mal im internet nach 'htonll'
    🙂



  • Hi, auf die Idee kam ich auch schon aber ich würde an der Stelle gerne auch zur eigenen Routine mein Wissen erweitern. Leider weis ich nicht was hier falsch sein könnte..



  • ^^deine funktion sieht eigentlich richtig aus. sie dreht die reihenfolge der bytes um. soll sie vielleicht bits umdrehen?
    🙂



  • Also es soll die position der Bits verändert werden. Wenn ich mir die beiden Zahlen anschaue dann sieht man ja, dass das MSB dann an der Stelle des LSB´s steht usw.

    Übergeben: 0xDD2D --> 1101110100101101
    Erwartet: 0xBB4B -> 1011101101001011

    Aber es steht eben 0xDDD200000000 im Speicher, dass verstehe ich halt nicht. Bis zum return steht ja immer 1 Byte in B1-8 und der Fehler muss wohl beim Return auftreten..



  • Hallo, mir ist ein kleiner Fehler unterlaufen natürlich sollten die Bytes gedreht werden. Das zu erwartende Ergebnis ist dann 0xDDD2

    Ich bin nun ein Stück weiter. Wenn ich den Code von oben modifiziere und unsigned __int64 gegen unsigned Char tausche passt das Ergebnis. Aber wieso kommt mit __int64 0xddd200000.. Wenn mir das jemand erklärt, dann wäre ich ein ganzes Stück klüger 😮

    unsigned char b1 = (value >>  0) & 0xff;
    unsigned char b2 = (value >>  8) & 0xff;
    unsigned char b3 = (value >> 16) & 0xff;
    unsigned char b4 = (value >> 24) & 0xff;
    unsigned char b5 = (value >> 32) & 0xff;
    unsigned char b6 = (value >> 40) & 0xff;
    unsigned char b7 = (value >> 48) & 0xff;
    unsigned char b8 = (value >> 56) & 0xff;
    
    unsigned __int64 result =  b1 << 56 | b2 << 48 | b3 << 40 | b4 << 32 |
    			b5 << 24 | b6 << 16 | b7 <<  8 | b8 <<  0;
    
    return result;
    

Anmelden zum Antworten