Seite 1 von 2
D4 AA 75 BC C3 CC 42 24 in Datum konvertieren?
Verfasst: 23.10.2006 16:22
von Delle
Hallo,
weiß jemand in welches Format hier das Datum konvertiert wurde?
Es liegt mir leider nur in Hex vor...
00 7A 75 BC C3 CC 42 24 ---> 09.06.2005 14:53:52
D4 AA 75 BC C3 CC 42 24 ---> 09.06.2005 14:54:17
Bräuchte also eine Funktion die eben z.B. D4 AA 75 BC C3 CC 42 24
ins richtige Datum umwandelt bzw. wie eben der Aufbau ist.
Sieht aus wie eine Timestamp oder sowas in der Art...
Oben sieht man ja auch deutlich, dass sich die ersten 2 Bytes
unterscheiden, von daher dürfte das nicht sooo schwer sein oder?
In einem anderen Forum kam dieser Tipp:
Datumsangaben werden i.d.R. als simpler Fließkommawert gespeichert. Die 8 Byte sprechen hier genau für dieses System.
Verfasst: 23.10.2006 16:58
von NicTheQuick
Ich würde eher sagen, dass die 8 Bytes ein Quad darstellen. Zumindest
wüsste ich nicht, wozu man halbe Sekunden bräuchte und ähnliches.
Leider habe ich auf die Schnelle nicht herausgefunden, wie man aus dem
Format, was du da hast, in das PB-Datumsformat konvertieren kann.
Verfasst: 23.10.2006 17:03
von Delle
So weitere Lösungsansätze:
spontan fällt mir auf:
0x7A00 = 31232
0xAAD4 = 43732
43732 - 31232 = 12500
12500 / 500 = 25
14:53:52 + 25 Sekunden = 14:54:17
A8 DB 75 BC C3 CC 42 24 wäre also 09.06.2005 14:54:42
du kannst nun das ganze zurück rechnen.
und
wenn mich nicht alles täuscht:
ein Tag ist 0x2932E00
2442CCC3BADC4C00 = 09.06.2005 00:00:00
damit wird also die Zeit seit dem Jahre 0 angegeben.
Weiß jemand, wie man das in PB am Einfachsten (nicht am Schnellsten) umrechnet?
Verfasst: 23.10.2006 17:42
von Kaeru Gaman
hast du diese funktion denn wenigstens als .exe vorliegen oder sonstwie, dass man sie testen kann?
ich würd halt mal auch mit verschiedenem datum testen, um zu sehen,
ob es wirklich ein einziger wert für fortlaufende sekunden ist,
oder ob es vielleicht ne struct ist, die aus mehreren teilwerten zusammengesetzt ist.
dass die niedrigste wertigkeit auf sekunden passt, ist ja schön und gut,
aber damit hast du keine aussage, ob die höherwertigen stellen auch in sekunden gerechnet sind.
Verfasst: 23.10.2006 18:19
von Delle
Nein, habe leider nur diese Bytefolgen vorliegen und eben diese 2 Datumsangaben die zu 100% übereinstimmen.
Aber ich weiß ja nichtmal wie man z.B. aus 0x7A00 "31232" macht
PeekW() hab ich probiert... aber vorher muss ja wohl noch alle Bytes umkehren usw.
Und wenn 2442CCC3BADC4C00 = 09.06.2005 00:00:00 (Stunde Null) ist, würde ja theoretisch irgendwie die Anzahl der vergangen Sekunden seitdem reichen um es irgendwie ins PB-Datumsformat umzurechnen und auszugeben.
Verfasst: 23.10.2006 19:14
von NicTheQuick
Ich glaube ich habe es jetzt geschafft. Ich habe dazu noch ein eigenes
Datumsformat benutzt, das auch Millisekunden enthält.
Ich hoffe du verstehst den Code. Falls nicht, frag einfach nach.
Code: Alles auswählen
Procedure.q InvertQ(q.q)
Protected *b1.Byte, *b2.Byte
*b1 = @q
*b2 = *b1 + 7
Repeat
Swap *b1\b, *b2\b
*b1 + 1
*b2 - 1
Until *b1 > *b2
ProcedureReturn q
EndProcedure
Macro DateQ2MS(date)
(-2612875315716397568 + InvertQ(date))
EndMacro
Macro DateMS2Q(date)
RSet(HexQ(InvertQ(date + 2612875315716397568)), 16, "0")
EndMacro
Macro DateMS2PB(date)
(date / 500)
EndMacro
Macro DatePB2MS(date)
(date * 500)
EndMacro
Procedure.s FormatDateMS(mask.s, dateMS.q)
Protected ms.l
ms = dateMS % 500 * 2
dateMS / 500
If ms : mask = ReplaceString(mask, "%ss", "%ss." + RSet(Str(ms), 3, "0")) : EndIf
ProcedureReturn FormatDate(mask, dateMS)
EndProcedure
Procedure.q DateMS(year.l, month.l, day.l, hour.l, minute.l, second.l, MilliSecond.l = 0)
Protected date.q
date = Date(year, month, day, hour, minute, second) * 500 + MilliSecond / 2
ProcedureReturn date
EndProcedure
Debug FormatDateMS("%dd.%mm.%yyyy %hh:%ii:%ss", DateQ2MS($007A75BCC3CC4224))
Debug FormatDateMS("%dd.%mm.%yyyy %hh:%ii:%ss", DateQ2MS($D4AA75BCC3CC4224))
Debug DateMS2Q(DateMS(2005, 6, 9, 14, 53, 52))
Verfasst: 24.10.2006 09:29
von NicTheQuick
[blödefrage]Kann man damit jetzt was anfangen?[/blödefrage]
Verfasst: 24.10.2006 10:29
von Kaeru Gaman
wenn es tatsächlich nur son durchlaufendes datum is...
müsste dann nich auch
gehen?
es scheint doch wie das interne datum zu sein, nur ein anderes Offset zu haben.... o_O
Verfasst: 24.10.2006 13:21
von NicTheQuick
Ja, und dass es auf 500 Millisekunden genau läuft und nicht wie in PB
Sekundengenau. Hinzu kommt auch noch, dass PBDate nur mit Longs
arbeitet und z.B. nicht das Jahr 1234 darstellen kann.
Verfasst: 24.10.2006 15:57
von Kaeru Gaman
jagut, ginge dann trotzdem einfach.
Wert/2 -> sekunden
+/- Offset -> startwert wie PB
in ne LONG rüberschieben, und übergeben an FormatDate