(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;
groesse := PInteger(@buffer[0])^;
... 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
Delphi-Quellcode:
buffer[0] := $FE;
buffer[1] := $E2;
buffer[2] := $00;
buffer[3] := $00;
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? =)
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