AGB  ·  Datenschutz  ·  Impressum  







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

Delphi Doubles / TDateTime zu Java

Ein Thema von ciceroo · begonnen am 20. Mai 2010 · letzter Beitrag vom 21. Mai 2010
Antwort Antwort
Seite 1 von 2  1 2      
ciceroo

Registriert seit: 20. Mai 2010
5 Beiträge
 
#1

Delphi Doubles / TDateTime zu Java

  Alt 20. Mai 2010, 19:26
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Delphi Doubles / TDateTime zu Java

  Alt 20. Mai 2010, 19:29
der Stichtag ist 31.12.1899 (Wert 0) also ist 2 tatsächlich der 2. Januar 1900
Markus Kinzler
  Mit Zitat antworten Zitat
ciceroo

Registriert seit: 20. Mai 2010
5 Beiträge
 
#3

Re: Delphi Doubles / TDateTime zu Java

  Alt 20. Mai 2010, 19:37
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Delphi Doubles / TDateTime zu Java

  Alt 20. Mai 2010, 19:42
Dann wäre es vielleicht sinnvoll die Werte im ISO-Format abzuspeichern
Markus Kinzler
  Mit Zitat antworten Zitat
ciceroo

Registriert seit: 20. Mai 2010
5 Beiträge
 
#5

Re: Delphi Doubles / TDateTime zu Java

  Alt 20. Mai 2010, 19:49
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

BlockWrite() geschrieben.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Delphi Doubles / TDateTime zu Java

  Alt 20. Mai 2010, 19:54
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?



http://docwiki.embarcadero.com/VCL/de/System.TDateTime
Angehängte Dateien
Dateityp: z test_111.z (8 Bytes, 1x aufgerufen)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
ciceroo

Registriert seit: 20. Mai 2010
5 Beiträge
 
#7

Re: Delphi Doubles / TDateTime zu Java

  Alt 20. Mai 2010, 20:20
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Delphi Doubles / TDateTime zu Java

  Alt 20. Mai 2010, 21:09
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.

[edit]
irgendwann merk ich mir das auch mal
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Delphi Doubles / TDateTime zu Java

  Alt 20. Mai 2010, 21:18
Frank du verwechselst hier Little und Big Endian.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#10

Re: Delphi Doubles / TDateTime zu Java

  Alt 20. Mai 2010, 21:18
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

EDIT: Roter Kasten, wo bist du?
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  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 00:29 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