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
Seite 1 von 2  1 2      
amoibos

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

Deserialisierung von einem Integer-Wert

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

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

AW: Deserialisierung von einem Integer-Wert

  Alt 13. Jan 2016, 14: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, 14: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.000 Beiträge
 
Delphi 12 Athens
 
#4

AW: Deserialisierung von einem Integer-Wert

  Alt 13. Jan 2016, 14: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, 14: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
110 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Deserialisierung von einem Integer-Wert

  Alt 13. Jan 2016, 15: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, 15: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
amoibos

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

AW: Deserialisierung von einem Integer-Wert

  Alt 13. Jan 2016, 15:25
Was soll daran denn keine Serialisierung sein? Und 1234h als 00 00 12 34 abzulegen ist Big Endian.

Geändert von amoibos (13. Jan 2016 um 15:29 Uhr)
  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
 
#9

AW: Deserialisierung von einem Integer-Wert

  Alt 13. Jan 2016, 15:29
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: §"!)(/&!

Und 1234h als 00 00 12 34 abzulegen ist Big Endian.
Ja, aber Delphi (bzw. deine CPU) benutzt Little Endian - Also warum Big Endian?
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."

Geändert von Neutral General (13. Jan 2016 um 15:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.120 Beiträge
 
Delphi 12 Athens
 
#10

AW: Deserialisierung von einem Integer-Wert

  Alt 14. Jan 2016, 09:23
PS: Ein string[4] ist 5 Byte groß.

Ratet mal warum.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:44 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