[erledigt] Little-Endian-DWord zu Integer und zurück
(Delphi 7 Personal)
Hallo Jungens, für ein Programm, das sich aus einem MemoryStream Größen holt, die da als Dwords im Little-Endian-Format stehen, habe ich nach einer Möglichkeit gesucht, die 4 Bytes, sobald sie in meinen Byte-Array-Puffer geladen wurden, in Integer umzuwandeln, um damit arbeiten zu können. Von Assembler wollte und will ich gänzlich die Finger lassen, weil ich keinen Schimmer davon habe. Offensichtlich ist es mit Pointern nicht anders, denn ich fand diese simple Lösung für mein Problem...
Delphi-Quellcode:
buffer: Array[0..3] of Byte;
groesse: integer;
Delphi-Quellcode:
... die ich nicht verstehe :? Ich habe das an einem schlichten Programm getestet und es scheint wunderbar zu funktionieren, wenn ich von Hand in das Array etwas eintrage, etwa
groesse := PInteger(@buffer[0])^;
Delphi-Quellcode:
dann wird das richtig umgewandelt in die Integer 58110, da es hexadezimal ja E2FE ist, ich verstehe aber nicht, was in dieser kleinen Zeile alles drin steckt. Dass PInteger ein Pointer auf Integerzahlen ist und die grobe Funktion von @ und ^ konnte ich auf einschlägigen Seiten lesen, aber wie funktioniert das zum Beispiel, dass trotz des Aufrufs von Index 0 des Arrays die ganze Zahl umgewandelt wird? Denkt die Funktion mit? =)
buffer[0] := $FE;
buffer[1] := $E2; buffer[2] := $00; buffer[3] := $00; Die zweite Sache ist nämlich die, dass ich bestimmte Bytes verändern und dann wieder in den MemoryStream schicken möchte, und das heißt für mich: Integer bearbeiten, wieder in Little-Endian-Form bringen, in ein Byte-Array schreiben und mittels stream.WriteBuffer(buffer, 4) den entsprechenden Wert im MemoryStream überschreiben. Zusätzlich zur allgemeinen Frage also noch die Frage: Wie sieht der äußert raffinierte Befehl rückwärts aus, also von Integer zu Byte-Array oder viel primitiver gefragt - geht das überhaupt so einfach? Würde mich über fachmännische Hilfe sehr freuen! =) Grüßle Dani PS: Ich bin mir sicher, dass die Delphi Hilfe da ein paar schlaue Sachen bereit hält, aber Windows Vista meint irgendwie, alte Hilfedateien nicht mehr anzeigen zu müssen :( |
Re: Little-Endian-DWord zu Integer und zurück
Zitat:
@buffer[0] - Adresse dieses ersten Elementes PInteger(@buffer[0]) - Es handelt sich um einen Zeiger auf Integer PInteger(@buffer[0])^ - Wir sind nicht an dem Zeiger interessiert, sondern an den dahinterliegenden Daten (Dereferenzierung) Ich hoffe, das bringt etwas mehr Klarheit. |
Re: Little-Endian-DWord zu Integer und zurück
Zitat:
MfG, Bug |
Re: Little-Endian-DWord zu Integer und zurück
Moin moin,
Zitat:
Delphi-Quellcode:
Ein Integer "besteht" ja aus 4 Bytes (SizeOf(Integer) = 4), es ist also - aus sicht des PCs - das gleiche wie ein Array[0..3] of Byte.
//..
groesse := 439041101; PInteger(@buffer[0])^ := groesse; //.. Ein PInteger zeigt auf das erste Byte von den 4 Bytes eines Integers. @buffer[0] zeigt ebenfalls auf das erste Byte unseres Arrays. Wenn wir jetzt dem Compiler mitteilen, das @buffer[0] ein PInteger ist, können wir diesen ganz einfach dereferenzieren und einen Wert zuweisen. Was ich bei dir nur nicht verstehe, warum musst du überhaupt den Weg über ein Array[0..3] of Byte gehen? Du kannst die Werte doch direkt in einen Integer einlesen? |
Re: Little-Endian-DWord zu Integer und zurück
Zitat:
Wenn du denn Wert vor dem "in den Integer schreiben" in Big-Endian umsortierst, kommt nur Grütze heraus. MfG, Bug |
Re: Little-Endian-DWord zu Integer und zurück
Moin moin,
Zitat:
Zitat:
|
Re: Little-Endian-DWord zu Integer und zurück
Zitat:
|
Re: [erledigt] Little-Endian-DWord zu Integer und zurück
hier mal eine kleine funktion...
Delphi-Quellcode:
function BigEndian2LittleEndian(aInt: integer): integer;
asm xchg ah, al; rol eax, 16; xchg ah, al; end; aber wie du das wieder zurück bekommst :gruebel: :gruebel: |
Re: [erledigt] Little-Endian-DWord zu Integer und zurück
Hallo!
Zitat:
Liebe Grüsse Laufi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz