%I64X



  • Hallo,
    ich habe einen hexstring der einen 64Bit abbildet.

    bb4b0a0f1470a00

    Diesen führe ich sscanf zu, und erzeuge ein __int64

    __int64 val(0);
    char idstr[]="0xbb4b0a0f1470a00";
    sscanf(&idstr[2], "%I64X", &val);

    Wie man sieht kann man die Zahl in Hi und Lo zerlegen:
    bb4b0a0f 1470a00 dabei ist zu erkennen das nur der Hi Teil
    komplett ist, im Lo teil "fehlt" eine Ziffer.

    sscanf scheint nun einen Fehler zu machen:

    Da ich wohl den Korrekten HI Wert aber nicht den korrekten LO
    Wert erhalte. (hier ist hi und lo im gegensatz zum PC gedreht)

    DWORD IdHi = (DWORD)(val);
    DWORD IdLo = (DWORD)(val>>32); (hier ist ein unrichter Wert entahlten)

    Erst wenn ich die fehlende Lücke in der obigen Zahl mit einer Null
    fülle ist das Ergebnis von LO wieder korrekt:

    bb4b0a0f 01470a00 //am Lo Teil wurde eine Null angesetzt

    Beide Teile der Zahl sind nun gleich lang, dieser Wert wird mit der vorgestellten Null nun einwandfrei hergestellt.

    Gibt es Hinweise wo der Fehler ist?

    Vielen Dank
    Karsten



  • Wir machen zuerst mal ein vollständiges Beispiel und führen dies aus:

    #include <Windows.h>
    #include <tchar.h>
    #include <stdio.h>
    #include <assert.h>
    
    int _tmain()
    {
        __int64 val; 
        char idstr[]="0xbb4b0a0f1470a00"; 
        int res = sscanf(&idstr[2], "%I64X", &val); 
        assert(res == 1);
    
        printf("Org: %s\nNew: 0x%I64X\n", idstr, val);
    
        DWORD dwLo = (DWORD) val;
        DWORD dwHi = (DWORD) (((unsigned __int64) val) >> 32);
    
        printf("Hi:  0x%X\n", dwHi);
        printf("Lo:         0x%X\n", dwLo);
    
    }
    

    Ergebnis:

    Org: 0xbb4b0a0f1470a00
    New: 0xBB4B0A0F1470A00
    Hi:  0xBB4B0A0
    Lo:         0xF1470A00
    

    Ich kann also kein Problem erkennen...

    VS2010... vielleicht hast Du VS6, da gab es im Zusammenhang mit __in64 noch ein paar kleine Bugs... aber versuche zuerst mal, ob dies Beispiel korrekt geht oder nicht



  • Hallo Jochen

    //lösche alle nicht erwünschten bits
    bigint &= ~(__int64)0xffffffff00000000;

    Das habe ich nun vor dem rShift , das geht auch.
    Kommt dann genauso wie der __int64 cast..

    thx alles klar jetzt ..

    biba
    Karsten


Anmelden zum Antworten