AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Deserialisierung von einem Integer-Wert

Ein Thema von amoibos · begonnen am 13. Jan 2016 · letzter Beitrag vom 14. Jan 2016
Antwort Antwort
amoibos

Registriert seit: 1. Sep 2015
33 Beiträge
 
Delphi 5 Professional
 
#1

Deserialisierung von einem Integer-Wert

  Alt 13. Jan 2016, 14:52
Delphi-Version: 5
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..

Geändert von amoibos (13. Jan 2016 um 14:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#2

AW: Deserialisierung von einem Integer-Wert

  Alt 13. Jan 2016, 15:02
(Delphi mag Big Endian)
Seit wann denn das?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
amoibos

Registriert seit: 1. Sep 2015
33 Beiträge
 
Delphi 5 Professional
 
#3

AW: Deserialisierung von einem Integer-Wert

  Alt 13. Jan 2016, 15:11
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#4

AW: Deserialisierung von einem Integer-Wert

  Alt 13. Jan 2016, 15:31
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. 04 00 00 12 entspricht somit $12000004 = 301989892.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Deserialisierung von einem Integer-Wert

  Alt 13. Jan 2016, 15:58
Mal ne andere Frage... Warum nicht einfach per IntToStr und StrToInt serialisieren/deserialisieren?
Dein seltsames Konstrukt ist doch viel zu kompliziert/überflüssig.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Zoot

Registriert seit: 30. Jan 2006
Ort: Hessen
113 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Deserialisierung von einem Integer-Wert

  Alt 13. Jan 2016, 16:05
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. 04 00 00 12 entspricht somit $12000004 = 301989892.

Erschwerend kommt hinzu, dass die Ziffern "1234" nicht etwa einem Speicherinhalt von 1234 entsprechen.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Deserialisierung von einem Integer-Wert

  Alt 13. Jan 2016, 16:14
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:26 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 by Thomas Breitkreuz