Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Doubles / TDateTime zu Java (https://www.delphipraxis.net/151516-delphi-doubles-tdatetime-zu-java.html)

ciceroo 20. Mai 2010 18:26


Delphi Doubles / TDateTime zu Java
 
Hallo,

gleich vorne weg, ich bin kein Delphi Experte.

Zum Problem:

Ich muss mit einem Java Programm binäre Dateien lesen, die mit Delphi geschrieben wurden. Soweit bisher kein Problem, denn die Integer, Short-Felder etc. sind alle korrekt wiederherzustellen.
Allerdings wird in dem benutzten Delphi serializer ein TDateTime-type gespeichert. Dieser wird laut google wohl als Double abgebildet, mit Tagen seit Stichtag vorkomma und Zeit nachkomma. Diesen Double kann ich auch in Java als Double einlesen und in das Java Epochtime-Format umwandeln, nur scheinen mir die ursprünglichen Werte schon implausibel. Denn z.B. eine Vorkomma 2, hieße ja, dass wir uns noch im Jahre 1900 befänden, die Werte wurden in Delphi allerdings mithilfe der Now-Funktion gespeichert, also erwarte ich (Vor-Komma) Werte um die 40000.

Beide Sprachen implementieren meines Wissens jedoch den Double nach IEEE 754.

Weiß jemand einen Ansatzpunkt, sprich wird da irgendein byte gedreht oder ist meine Information das ein TDateTime intern ein Double ist schlicht falsch?

Vielen Dank & Gruß
Julian

mkinzler 20. Mai 2010 18:29

Re: Delphi Doubles / TDateTime zu Java
 
der Stichtag ist 31.12.1899 (Wert 0) also ist 2 tatsächlich der 2. Januar 1900

ciceroo 20. Mai 2010 18:37

Re: Delphi Doubles / TDateTime zu Java
 
Ja, da hat aber noch keiner das Programm benutzt ;)

Ich erwähnte ja, das die Werte mit der Now-Funktion gespeichert wurden, also auf jeden Fall Werte um die 40000 rauskommen müssten.
Ich will darauf hinaus, dass das irgendwie kein IEEE 754 Double sein kann, der da gespeichert wird.

P.S. das Delphi programm läuft auch rund, sprich die dort wiedereingelesenen Doubles stimmen. Nur wenn ich versuche mit Java zu lesen kommt quark raus.

mkinzler 20. Mai 2010 18:42

Re: Delphi Doubles / TDateTime zu Java
 
Dann wäre es vielleicht sinnvoll die Werte im ISO-Format abzuspeichern

ciceroo 20. Mai 2010 18:49

Re: Delphi Doubles / TDateTime zu Java
 
Danke schon mal. Habe leider vergessen zu erwähnen, dass am Delphi Programm nichts mehr zu ändern ist, sprich die Speicherung bleibt weiterhin byteweise. Ich habe zwar die Source, aber die Software beim Kunden soll nicht verändert werden, das Java Programm muss mit diesen Dateien arbeiten.

Kurzer Code-Auszug
Dieser Type:
Delphi-Quellcode:
type
   DatenBlock = packed record
    ID: dword;
    AccessTime: TDateTime;
    Feature01: byte;
end;
wird dann mit

Delphi-Quellcode:
BlockWrite()
geschrieben.

himitsu 20. Mai 2010 18:54

Re: Delphi Doubles / TDateTime zu Java
 
Liste der Anhänge anzeigen (Anzahl: 1)
TDateTime / Double entspricht dem Float mit doppelter Genauigkeit einer normalen Intel-CPU und demnach kann es nur IEEE 754 sein ... es ist kein delphieigener Datentyp.

Im Anhang liegt eine kleine Testdatei für dich, diese enthält den Wert 1234.5 als Double.
Damit kannst du erstmal in Ruhe testen und schauen was in dem Javaprogramm rauskommt.
Eventuell könntest du mal versuchen die Reihenfolge der Bytes zu tauschen? :gruebel:



http://docwiki.embarcadero.com/VCL/de/System.TDateTime

ciceroo 20. Mai 2010 19:20

Re: Delphi Doubles / TDateTime zu Java
 
Oh, vielen Dank. Das spart mir den Erwerb eines Delphi Compilers ;)

So, das war jetzt auch hilfreich. Der Double-Wert 1234.5 nach Delphi Serialisierung:

00000000004A9340

und nach Java:

40934A0000000000

Muss also scheinbar nur die Blöcke umdrehen. Vielen Dank für die hilfreichen Kommentare.

Ich weiss schon, warum ich lieber mit JSON/XML serialisiere...

himitsu 20. Mai 2010 20:09

Re: Delphi Doubles / TDateTime zu Java
 
Dann scheint es wohl so zu sein, daß die JAVA-VM eine Speicherverwaltung in LittleBig-Endian verwendet (wie der Mac), wärend Windows, Linux und demnach auch Delphi, C++ und Co. (welche für diese Plattformen Compilate erstellen) mit BigLittle-Endian arbeiten.

Das würde bedeuten, daß du auch an anderen Stellen (z.B. bei der ID) aufpassen müßtest. :gruebel:

[edit]
irgendwann merk ich mir das auch mal :oops:

mkinzler 20. Mai 2010 20:18

Re: Delphi Doubles / TDateTime zu Java
 
Frank du verwechselst hier Little und Big Endian.

BUG 20. Mai 2010 20:18

Re: Delphi Doubles / TDateTime zu Java
 
Zitat:

Zitat von himitsu
Dann scheint es wohl so zu sein, daß die JAVA-VM eine Speicherverwaltung in Little-Endian verwendet (wie der Mac), wärend Windows, Linux und demnach auch Delphi, C++ und Co. (welche für diese Plattformen Compilate erstellen) mit Big-Endian arbeiten.

Leider genau anders herum :mrgreen:

EDIT: Roter Kasten, wo bist du?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:41 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