![]() |
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:
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..s: string[4]; int: integer absolute s; //Testfall s = 00 00 12 34 s := copy(Data, DataPosition, sizeof(Integer)); int := PInteger(@s)^; |
AW: Deserialisierung von einem Integer-Wert
Zitat:
|
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.
|
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:
entspricht somit $12000004 = 301989892.
04 00 00 12
|
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. |
AW: Deserialisierung von einem Integer-Wert
Zitat:
Erschwerend kommt hinzu, dass die Ziffern "1234" nicht etwa einem Speicherinhalt von 1234 entsprechen. |
AW: Deserialisierung von einem Integer-Wert
Zitat:
Inwiefern das dann serialisiert ist frag ich mich dann allerdings auch :mrgreen: |
AW: Deserialisierung von einem Integer-Wert
Was soll daran denn keine Serialisierung sein? Und 1234h als 00 00 12 34 abzulegen ist Big Endian.
|
AW: Deserialisierung von einem Integer-Wert
Zitat:
(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:
|
AW: Deserialisierung von einem Integer-Wert
PS: Ein
Delphi-Quellcode:
ist 5 Byte groß.
string[4]
Ratet mal warum. :stupid: |
AW: Deserialisierung von einem Integer-Wert
Weil Uwe es
![]() |
AW: Deserialisierung von einem Integer-Wert
:oops:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz