Hex zu dez. wandeln

  • Hallo

    bekomme über IniRead folgenden Wert 01cb457148063b20 (entspricht Sekunden seit epocheiner Zeitangabe ungefähr 2010/08/26 22:55:06), wie kann ich diesen in dezimal umwandeln (da _DateAdd damit nicht zurechtkommt)?

    mfg autoBert

    2 Mal editiert, zuletzt von autoBert (26. August 2010 um 23:22)

    • Offizieller Beitrag

    Das ist ein 64 Bit Wert. Hex und Dec können aber nur 32 Bit.
    Du musst also erstmal in zwei 32 Bit Werte aufteilen und anschließend das höherwertige LongWord mit 2^32 malnehmen:

    [entfernt]

    lieber so:

    [autoit]


    $hex = '01cb418221f6afc0'
    ConsoleWrite(_Dec64($hex) & @CR)

    [/autoit][autoit][/autoit][autoit]

    Func _Dec64($sHex)
    Local $sDec1, $sDec2, $iLen = StringLen($sHex)
    If Not StringIsXDigit($sHex) Then Return SetError(1, 0, 0)
    $sDec2 = Dec(StringRight($sHex, 8))
    If $sDec2 = -1 Then $sDec2 = 2 ^ 32 - 1
    $sDec1 = Dec(StringLeft($sHex, $iLen - 8))
    Return $sDec1 * 2 ^ 32 + $sDec2
    EndFunc

    [/autoit]
  • Hallo Oscar,

    danke das Umrechnen klappt, nur ist dadurch bewiesen dass meine Vermutung es handele sich um Sekundenwerte seit Epoch wiederlegt denn _DateAdd gibt darauf genauso 0 zurück wie beim Originalwert.

    diesen Wert EndTime=01cb448214cfa1a0 wollte ich umrechnen Ergebnis sollte 2010/08/25 18:19:39 entsprechen, ich komme aber nicht dahinter wie er kodiert ist. Da das Erstellungsdatum der Datei meistens nur minimal von dem erwarteteten Wert abweicht, werde ich diesen nehmen

    mfg autoBert

    • Offizieller Beitrag

    Der Wert entspricht den Nanosekunden seit: 1601/01/01 00:00:00

    [autoit]


    #include <Date.au3>

    [/autoit][autoit][/autoit][autoit]

    $hex = '01cb448214cfa1a0'
    $dec = _Dec64($hex)
    ConsoleWrite($dec & @CR)
    ConsoleWrite(_DateAdd('s', Int($dec / 10 ^ 7), '1601/01/01 00:00:00') & @CR)

    [/autoit][autoit][/autoit][autoit]

    Func _Dec64($sHex)
    Local $sDec1, $sDec2, $iLen = StringLen($sHex)
    If Not StringIsXDigit($sHex) Then Return SetError(1, 0, 0)
    $sDec2 = Dec(StringRight($sHex, 8))
    If $sDec2 = -1 Then $sDec2 = 2 ^ 32 - 1
    $sDec1 = Dec(StringLeft($sHex, $iLen - 8))
    Return $sDec1 * 2 ^ 32 + $sDec2
    EndFunc ;==>_Dec64

    [/autoit]
  • Das Problem liegt m.E. darin, dass sich mehrere "Timestamp"-Formate etabliert haben. So lange man weiss , mit was man es zu tun hat ist alles paletti. Aber wehe, man trifft auf etwas unbekanntes, dann fängt, wie bei AutoBert, die Sucherei an. Ich habe da auch schon geflucht!
    In einigen Jahren wird man die bisherige Zeit

    Spoiler anzeigen
    Zitat von wikipedia

    Eine Sekunde ist das 9.192.631.770-fache der Periodendauer der dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes von Atomen des Nuklids 133Cs entsprechenden Strahlung.
    Definitionsgemäß ist die Sekunde also das Vielfache der Periode einer Mikrowelle, die mit einem ausgewählten Niveauübergang im Caesiumatom in Resonanz ist. Daher wird sie als Atomsekunde bezeichnet. Atomuhren basieren auf der Messung dieses Übergangs.

    erweitern auf die Anzahl dieser Schwingungen seit dem Urknall.
    Das wird dann die "Universumszeit" :D
    Irgendwie muss man ja die 1 Gigabit breiten Register der zukünftigen Rechner mit unwichtigemm Krempel verfüllen :rolleyes:

  • Moin,

    in AutoIt gibt es doch für fast alles schon fertige Lösungen:

    [autoit]

    #include <Date.au3>
    $HexTime = "01cb448214cfa1a0"
    $tFILETIME = DllStructCreate($tagFILETIME)
    DllStructSetData($tFILETIME, "Lo", Dec(StringRight($HexTime, 8)))
    DllStructSetData($tFILETIME, "Hi", Dec(StringLeft($HexTime, 8)))
    $tSYSTEMTIME = _Date_Time_FileTimeToSystemTime(DllStructGetPtr($tFILETIME))
    MsgBox(0, "Zeitstempel", _Date_Time_SystemTimeToDateTimeStr($tSYSTEMTIME, 1))

    [/autoit]