D4 AA 75 BC C3 CC 42 24 in Datum konvertieren?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

D4 AA 75 BC C3 CC 42 24 in Datum konvertieren?

Beitrag 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.
PB 6.21 | Win 11
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag 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?
PB 6.21 | Win 11
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag 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.
PB 6.21 | Win 11
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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))
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

[blödefrage]Kann man damit jetzt was anfangen?[/blödefrage]
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

wenn es tatsächlich nur son durchlaufendes datum is...

müsste dann nich auch

Code: Alles auswählen

FormatDate( maske$, Zahl + Offset )
gehen?

es scheint doch wie das interne datum zu sein, nur ein anderes Offset zu haben.... o_O
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

jagut, ginge dann trotzdem einfach.

Wert/2 -> sekunden
+/- Offset -> startwert wie PB
in ne LONG rüberschieben, und übergeben an FormatDate
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten