Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Deserialisierung von einem Integer-Wert (https://www.delphipraxis.net/187898-deserialisierung-von-einem-integer-wert.html)

amoibos 13. Jan 2016 13:52

Delphi-Version: 5

Deserialisierung von einem Integer-Wert
 
Hallo,
ich habe erfolgreich elementare Datentypen serialisiert, nun möchte ich diese wieder auslesen. Dabei gehe ich über den Weg wie Delphi selbst seine Daten im Speicher ablegt(Delphi mag Big Endian). Nun habe ich folgendes Snippet:



Code:
 
s: string[4];
int: integer absolute s;

//Testfall s = 00 00 12 34
s := copy(Data, DataPosition, sizeof(Integer));
int := PInteger(@s)^;
Dies liefert mir statt $1234 301989892. Ich habe keine Ahnung was da schiefläuft. s beiinhaltet den korrekten String nur macht er in der letzten Zeile was anders als gedacht..

Uwe Raabe 13. Jan 2016 14:02

AW: Deserialisierung von einem Integer-Wert
 
Zitat:

Zitat von amoibos (Beitrag 1326861)
(Delphi mag Big Endian)

Seit wann denn das?

amoibos 13. Jan 2016 14:11

AW: Deserialisierung von einem Integer-Wert
 
Vielleicht noch ein Zusatz um Nebenschauplätze zu schließen, die implizite Konvertierung findet ja bereits schon beim Kopiervorgang des Strings nach s statt. Folglich liefert die letzte Anweisung das gleiche fehlerhafte Ergebnis.

Uwe Raabe 13. Jan 2016 14:31

AW: Deserialisierung von einem Integer-Wert
 
Das kann so nicht funktionieren.

Ein string[4] in Delphi 5 stellt eine Speicherstruktur von 5 Byte dar - 1 für die Länge und vier Byte für die Daten. Aus dem Copy entsteht in s ein String der Länge 4 mit dem Inhalt "00 00 12 34". Der Speicherbereich sieht also so aus: 04 00 00 12 34

Du castest einen Pointer auf s in einen PInteger. Damit werden die ersten 4 Bytes des Bereichs als Integer (übrigens Little Endian) interpretiert.
Delphi-Quellcode:
04 00 00 12
entspricht somit $12000004 = 301989892.

Neutral General 13. Jan 2016 14:58

AW: Deserialisierung von einem Integer-Wert
 
Mal ne andere Frage... Warum nicht einfach per IntToStr und StrToInt serialisieren/deserialisieren?
Dein seltsames Konstrukt ist doch viel zu kompliziert/überflüssig.

Zoot 13. Jan 2016 15:05

AW: Deserialisierung von einem Integer-Wert
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1326869)
Das kann so nicht funktionieren.

Ein string[4] in Delphi 5 stellt eine Speicherstruktur von 5 Byte dar - 1 für die Länge und vier Byte für die Daten. Aus dem Copy entsteht in s ein String der Länge 4 mit dem Inhalt "00 00 12 34". Der Speicherbereich sieht also so aus: 04 00 00 12 34

Du castest einen Pointer auf s in einen PInteger. Damit werden die ersten 4 Bytes des Bereichs als Integer (übrigens Little Endian) interpretiert.
Delphi-Quellcode:
04 00 00 12
entspricht somit $12000004 = 301989892.


Erschwerend kommt hinzu, dass die Ziffern "1234" nicht etwa einem Speicherinhalt von 1234 entsprechen.

Neutral General 13. Jan 2016 15:14

AW: Deserialisierung von einem Integer-Wert
 
Zitat:

Zitat von Zoot (Beitrag 1326873)
Erschwerend kommt hinzu, dass die Ziffern "1234" nicht etwa einem Speicherinhalt von 1234 entsprechen.

Nach dem was er berichtet scheint sein String tatsächlich aus zwei #00, #$12 und einem #$34 aufgebaut zu sein. (Sonst käme bei ihm nicht 301989892 raus - siehe Post(s) von Uwe Raabe)
Inwiefern das dann serialisiert ist frag ich mich dann allerdings auch :mrgreen:

amoibos 13. Jan 2016 15:25

AW: Deserialisierung von einem Integer-Wert
 
Was soll daran denn keine Serialisierung sein? Und 1234h als 00 00 12 34 abzulegen ist Big Endian.

Neutral General 13. Jan 2016 15:29

AW: Deserialisierung von einem Integer-Wert
 
Zitat:

Zitat von amoibos (Beitrag 1326882)
Was soll daran denn keine Serialisierung sein?

Serialisieren: (Binär(e))Daten(strukturen) in eine (vom Menschen) lesbare Zeichenkette umwandeln.
(Ok das ist keine 100% richtige Definition, aber es ist das worauf es letztendlich meistens hinausläuft)

Du kopierst einfach nur den Integer-Wert 1:1 in einen String.
Wenn du das in eine Datei schreibst hast du das gleiche als würdest du den Integer sofort über einen Stream o.ä. in eine Datei schreiben und zwar
wahrscheinlich sowas wie: §"!)(/&!

Zitat:

Zitat von amoibos (Beitrag 1326882)
Und 1234h als 00 00 12 34 abzulegen ist Big Endian.

Ja, aber Delphi (bzw. deine CPU) benutzt Little Endian - Also warum Big Endian?

himitsu 14. Jan 2016 09:23

AW: Deserialisierung von einem Integer-Wert
 
PS: Ein
Delphi-Quellcode:
string[4]
ist 5 Byte groß.

Ratet mal warum. :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:29 Uhr.
Seite 1 von 2  1 2      

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