Verlust von Information beim Cast eines Bytebuffer mit int64
-
Hallo Zusammen,
bisher war ich noch nie in solchen Entwicklerforen unterwegs weil ich meine Probleme normalerweise selbst lösen konnte. Aktuell schreibe ich ein proof of concept für meine Masterarbeit und mir ist dabei ein mir unerklärliches Phänomen aufgefallen:
Beim casten eines ByteBuffers in eine int64, werden mir die letzten 2 Bytes abgeschnitten? Anbei ein Screenshot vom aktuellen Fehler.
Wer von Euch kennt dieses Phänomen und weiß wie man es umgehen kann?
unsigned __int64 mftReference; // input ist buffered Stream des typs wifstream und der input im pwszBuffer stimmt auch if ( input ) { input.read ( pwszBuffer , sizeof(unsigned __int64 )); //sollte 0x0001000000000024 sein mftReference = *(unsigned __int64 *)pwszBuffer; }Bild:
http://img829.imageshack.us/img829/7840/errorgn.pngpwszBuffer ist ein wchar_t * Buffer der teile einer Windows Systemdatei einliest.
mftReference ist als unsigned __int64 deklariert und sollte eigentlich 00 01 00 00 00 00 00 24 sein, und nicht 00 00 00 00 00 00 00 24Ich hoffe hier kann mir irgendwer helfen

/edit
Im Moment benutze ich den Workaround dass ich die Bytefolge selbst parse
unsigned __int64 byteToint64LittleEndian ( wchar_t * pwszBuffer ) { unsigned __int64 result = 0; unsigned __int64 temp = 0; result = pwszBuffer[0]; temp = pwszBuffer[1]; result = result | temp<<8; temp = pwszBuffer[2]; result = result | temp << 16; temp = pwszBuffer[3]; result = result | temp<<24; temp = pwszBuffer[4]; result = result | temp<<32; temp = pwszBuffer[5]; result = result | temp<<40; temp = pwszBuffer[6]; result = result | temp<<48; temp = pwszBuffer[7]; result = result | temp << 56; return result; }Das ist aber nicht die Art wie es eigentlich gehen sollte...
-
Ich sehe nicht, wieso die 01 da reinkomen sollte. Bedenke, dass jedes Element von pwszBuffer 2 Bytes groß ist, sodass nur pwszBuffer[0] bis einschließlich pwszBuffer[3] eingelesen werden.
Edit: Dein Workaround ist übrigens fehleranfällig. Wenn du im High Byte mal was stehen hast, kommt nicht mehr das raus, was du willst. Sollte pwszBuffer nicht besser ein char[] statt ein wchar_t[] sein?
-
Hi,
vielen Dank schonmal für die Antwort. Werde es morgen noch ausprobieren... vielleicht hatte ich die ganze Zeit einen Denkfehler drin weil ich halt eben auch nen Unicode String aus der Datei auspacken soll.
Den Bug im Workaround hab ich schon gefunden, wird aber niemals auftreten in meiner Anwendung... habe ihn aber trotzdem beseitigt indem ich das zuvor ge-or'te Feld immer zwangsläufig nulle.
Heute keinen Nerv mehr um weiter zu proggen.. werde es Euch morgen wissen lassen was der Fehler hier war.
Vielen herzlichen Dank für die Hilfe schonmal!

-
Was Michael meint, ist Folgendes:
Du liest acht wchar_ts in einen Buffer. Diese sind jeweils 2 Byte breit, macht zusammen 16 Byte. Dann interpretierst du das Ganze als 8-Byte-Integer.
Dass nicht der gesamte Inhalt des Buffers im Integer auftaucht, ist wenig verwunderlich.
-
Guten Tag

Das hab ich schon verstanden - kam nur heute noch nicht zum programmieren. Werde gleich mein Problem fixen. Vielen Dank für die Hilfe Jungs & Mädels, manchmal sieht man vor lauter Bäumen den Wald nicht mehr

-
Hallo Zusammen,
wollte es Euch nur nochmal wissen lassen. Der Tipp war goldrichtig und ich hab nebenher noch ein paar andere fixes innerhalb meines Programms eingebaut.
Vielen Dank für alles Leute!
Beste Grüße