![]() |
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 |
Re: Delphi Doubles / TDateTime zu Java
der Stichtag ist 31.12.1899 (Wert 0) also ist 2 tatsächlich der 2. Januar 1900
|
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. |
Re: Delphi Doubles / TDateTime zu Java
Dann wäre es vielleicht sinnvoll die Werte im ISO-Format abzuspeichern
|
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:
wird dann mit
type
DatenBlock = packed record ID: dword; AccessTime: TDateTime; Feature01: byte; end;
Delphi-Quellcode:
geschrieben.
BlockWrite()
|
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: ![]() |
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... |
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: |
Re: Delphi Doubles / TDateTime zu Java
Frank du verwechselst hier Little und Big Endian.
|
Re: Delphi Doubles / TDateTime zu Java
Zitat:
![]() EDIT: Roter Kasten, wo bist du? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 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