%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