Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1928to1932
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Datum aus Hexwert

VBA Datum aus Hexwert
16.05.2023 09:37:14
Joschi Witchcraft

Hallo Forum,

ich möchte gerne das Log einer Anwendung auswerten. Dabei habe ich einen Wert "ab,aa,aa,aa,ea,00,e6,40" gefunden, welcher ein Datum darstellen soll. Es sollte ein relativ aktuelles Datum sein. Eine Beschreibung der Log-Daten steht mir nicht zur Verfügung.

Wie kann man aus diesem Wert ein Datum ermitteln?

Gruß Joscchi

31
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Datum aus Hexwert
16.05.2023 09:59:38
Joschi Witchcraft
Hallo Gerd. Sorry. Habe ich gerade nachgeholt.


AW: VBA Datum aus Hexwert
16.05.2023 09:58:40
volti
Hallo Joschi,

meiner Meinung nach ein wenig abenteuerlich, Dein Ansinnen.
Selbst nach Umsetzung der "möglichen" HEX-Zahlen in Dezimalzahlen ergibt sich für mich kein Sinn, weder als Zahl noch als ASCII-Zeichen.

Man könnte meinen, dass 'ea,00,e6,40' ein Jahr sein könnte '201?', aber das ist ja auch Kaffeesatzleserei.

Aber vielleicht hat ja jemand anderes noch eine Idee dazu.

Sub Test()
  sArr = Split("ab,aa,aa,aa,ea,00,e6,40", ",")
  For i = 0 To UBound(sArr)
      Debug.Print Val("&H" & sArr(i)), Chr$(Val("&H" & sArr(i)))
  Next i
End Sub
Gruß KH


Anzeige
AW: VBA Datum aus Hexwert
16.05.2023 10:03:07
Joschi Witchcraft
Hallo Volti.

Danke für Deinen Code. Er hat mich aber der Lösung nicht näher gebracht. Mit dem Code werden nur die einzelnen Hex-Werte in einen Dezimalwert umgewandelt. Bis zu einem lesbaren Datum fehlt da noch einiges.

Gruß Joschi


AW: VBA Datum aus Hexwert
16.05.2023 10:51:00
Fennek
Hallo,

ein üblicher Zeitstempel in Hex wäre das:

Unix-Epoche -> Hex


Number(1608023024844).toString(16) 

ergibt:
"17665a424cc" 
Da bleibt die Frage, welche System zu den gezeigten Werten führen könnte.

mfg

PS: relative aktuelle Zeit, Javascript


AW: VBA Datum aus Hexwert
16.05.2023 15:37:53
Joschi Witchcraft
Danke für die Anregungen. Ich werde jetzt einige Experimente machen.

Eine Frage hätte ich noch: wie kann ich die Zahl 1608023024844 in einen Hexstring umwandeln? Die Funktion "Hex" bringt einen Laufzeitfehler 6


Anzeige
AW: VBA Datum aus Hexwert
16.05.2023 15:39:21
Der Steuerfuzzi
Deine Hex-Werte sind weit von den Unix-Zeiten für ein aktuelles Datum entfernt ... Umwandeln kannst Du im Netz, brauchst nur die Suchmaschine Deines vertrauens anzuwerfen.


AW: VBA Datum aus Hexwert
16.05.2023 11:28:23
volti
Hallo Joschi,

ja, das war auch klar, dass es keine Lösung darstellen sollte, sondern nur eine Unterstreichung, dass man mit den einzelnen HEX-Werten auch nach Umsetzung in diverse andere Formate nicht weiterkommt.

Ich kann mich da auch nur Michael anschließen, dass man da deutlich mehr Information braucht.

Gruß
KH


Anzeige
AW: VBA Datum aus Hexwert
16.05.2023 10:39:29
Der Steuerfuzzi
Hallo,

es ist natürlich nicht einfach aus einem Wert etwas "herauszulesen". Es wäre sicher sinnvoll, wenn Du mehrere Werte posten könntest und evtl. auch mehr Infos preis geben würdest. z. B. woher die Log-Datei kommt und ob Werte auch doppelt vorkommen.

Gruß
Michael


AW: VBA Datum aus Hexwert
18.05.2023 14:15:40
Planlos
Datum in englisch ist date, was jetzt auch wahrscheinlich der in Hex dargestellte Datentyp ist. mit nachfolgenden bsp-code erhalte ich das Datum
15.05.2023 11:00:00


Type dd
d As Date
End Type

Type ss
s As String * 4
End Type

Sub test()
    Dim dd As dd
    Dim ss As ss
    ss.s = ChrB(&HAB) & ChrB(&HAA) & ChrB(&HAA) & ChrB(&HAA) & ChrB(&HAE) & ChrB(&H0) & ChrB(&HE6) & ChrB(&H40)
    LSet dd = ss
    Debug.Print dd.d
End Sub


Anzeige
AW: Genial
18.05.2023 14:53:25
Fennek
Hallo,

sehr gute Antwort!

Was für ein Zeitstempel ist das? Vom Win-File-System?

mfg


AW: Genial
18.05.2023 15:53:56
Joschi Witchcraft
Hallo Fennek.

Vielen Dank für Deinen "genialen" Code.

Ich habe es mit neuen Daten probiert (zum alten Hex-String hatte ich nicht mehr das Vergleichsdatum), und das errechnete Datum ist mit dem identisch, was ich auch als Text-String gesehen habe.

Aber mit einem Text-String kann man nicht rechnen. Deshalb suchte ich einen Weg, die Hex-Werte in ein numerisches Datum umzuwandeln. Und das ist jetzt gelungen.

Mein VBA-Wissen reicht leider nicht aus, den Code so zu verändern, dass die einzelnen Teile des Hex-Wertes aus einem String kommen, so wie das am Anfang meines Threads beschrieben war: "ab,aa,aa,aa,ea,00,e6,40"

Danke und Gruß
Joschi


Anzeige
AW: Genial
18.05.2023 15:57:37
Joschi Witchcraft
Oh Verzeihung:

Ich habe zu spät gesehen, dass der Code von Planlos stammt und nicht von Fennek.

Ehre wem Ehre gebührt.

Gruß Joschi,


AW: Genial
18.05.2023 17:11:09
Planlos
Versuch

Sub Test2(ByVal sHex As String)
    Dim dd As dd
    Dim ss As ss
    Dim i As Long
    Dim sf() As String
    sf() = Split(sHex, ",")
    If UBound(sf()) - LBound(sf()) + 1 = 8 Then
        For i = LBound(sf()) To UBound(sf())
            MidB(ss.s, i + 1, 1) = ChrB("&H" & sf(i))
        Next
        LSet dd = ss
        Debug.Print dd.d
    End If
End Sub
Aufruf wäre dann z.B:

call test2( "ab,aa,aa,aa,ea,00,e6,40")
@Fennek
diese von Joschi gezeigte Hex$ wird wahrscheinlich nur das bitäquivalent zum ganz normalen windowsdatum sein, so wie es Windows im Speicher ablegt.


Anzeige
AW: Hallo Planlos
19.05.2023 11:41:17
Joschi Witchcraft
Hallo Planlos.

Jetzt hätte ich doch noch eine Frage: wie kann ich aus einem Datum im Excel-Format (Date) einen Code erzeugen, wie er EIngabe zu dem von DIr genannten Code ist?

Gruß Joschi


AW: Hallo Planlos
19.05.2023 12:54:56
onur
"wie kann ich aus einem Datum im Excel-Format (Date) einen Code erzeugen, wie er EIngabe zu dem von DIr genannten Code ist?" Ist das deutsch???
Aus einem Datum einen Code erzeugen ? Wie er Eingabe ist ? Häh ?.


AW: Hallo Planlos
19.05.2023 13:46:33
Joschi Witchcraft
Hallo onur.

Wenige Zeilen oberhalb meiner Frage ist im Thread der Code von Planlos abgebildet. Darunter auch der Aufruf:

call test2( "ab,aa,aa,aa,ea,00,e6,40")

Darauf bezog sich meine Frage.


Anzeige
AW: Hallo Planlos
19.05.2023 15:38:20
Pappawinni
Hallo Onur,
Es geht im Prinzip darum, das umzukehren was "Planlos" zuvor gemacht hat, nämlich aus einem String "ab,aa,aa,aa,ea,00,e6,40" ein Datum zu machen.
Aus einem Datum (date) soll also dann wieder ein entsprechender String entstehen.

Ich denke, dass da Unicode eine Rolle spielt, aber der Akt einen String praktisch gewaltsam in ein date zu schieben bzw. umgekehrt, sowas widerstrebt mir irgendwo.
Ich werde mir das nochmal genauer anschauen, wenn ich mal etwas mehr Zeit hab...


AW: Hallo Planlos
19.05.2023 15:48:00
Der Steuerfuzzi
Hallo,

also wenn Du aus dem Datum die Hexwerte ermitteln willst, dann z. B. so:
Sub DatumInBinaer()
Dim dd As dd
Dim ss As ss
Dim b() As Byte
dd.d = DateSerial(2023, 5, 17) + TimeSerial(8, 0, 0)
LSet ss = dd
b = ss.s
Dim i As Long, w As String
For i = 0 To 7
    w = w & Hex(b(i)) & IIf(i  7, ", ", "")
Next
Debug.Print w
End Sub
Gruß
Michael


Anzeige
Danke, Problem gelöst
19.05.2023 16:14:00
Joschi Witchcraft
Hallo Steuerfuzzi.

Ganz einfach, wenn man weiß, wie es funktioniert. Und Dein Code hat funktioniert.

Ich brauche den Hex-Code, um in der Steuerdatei einer Anwendung ein geändertes Datum zu setzen, damit eine bestimmte Aktion zu dem angegebenen Datum ausgeführt wird.

Jetzt bin ich wunschlos glücklich,

Gruß Joschi


AW: Hallo Planlos
19.05.2023 17:08:45
Der Steuerfuzzi
Hier noch ohne Umweg über den String:
Type dd
    d As Date
End Type
Type bb
    b(0 To 7) As Byte
End Type
 Sub DatumInBinaer()
 Dim dd As dd
 Dim bb As bb
 dd.d = DateSerial(2023, 5, 17) + TimeSerial(8, 0, 0)
 LSet bb = dd
 Dim i As Long, w As String
 For i = 0 To 7
    w = w & Hex(bb.b(i)) & IIf(i  7, ", ", "")
 Next
 Debug.Print w
 End Sub


Anzeige
AW: Hallo Planlos
20.05.2023 08:39:40
Joschi Witchcraft
Hallo Steuerfuzzi .

Wenn ich mir noch eine Bemerkung erlauben darf: ich sehe keinen Unterschied in den beiden Code, wenn man davon absieht, dass in der vorherigen Version die (erforderlichen) Type-Definitionen enthalten waren.

Gruß Joschi


AW: Hallo Planlos
20.05.2023 10:50:55
Planlos
Hallo Joschi
der Unterschied in den beiden Code's vom Steuerfuzzi ist das er im zweiten einen anderen Datentyp definiert hat, d.h. statt des
Type ss wird der neudefinierte Type bb verwendet. Ob du nun ss oder bb in deinem Code verwendest ist egal, beide Type'n liefern letzlich das gleiche Ergebnis.


AW: Hallo Planlos
20.05.2023 12:02:31
Pappawinni
Es geht auch ohne benutzerdefinierte Datentypen.
Wenn da quasi eine Double erzeugt wird, dann versteh ich nicht ganz, warum dd.d nicht als double ausgewiesen wird.
Würde das der internen Darstellung von date entsprechen, müsste man dd.d nicht auch noch zurechtbiegen, bevor man es als Date verwenden kann, oder?

Ich hab jetzt mal die eine Richtung zu Fuß, also ohne diesen Kunstgriff gemacht.
ist halt im Grunde relativ rechenaufwändig und insofern für umfangreichere Verwendung weniger ideal.
Mal so als Anschauungsbeispiel, wie im Grunde eine Double intern aufgebaut ist...
Hab das nicht ausführlich getestet und die Umkehrung spar ich mir mal.


Sub test()
    Dim strHex As String
    Dim strDblHex As String
    Dim dtD As Date
    Dim dblDate As Double
    Dim i As Long
    Dim B() As String
    
    strHex = "ab,aa,aa,aa,ea,00,e6,40"
    B = Split(strHex, ",")
    If UBound(B) = 7 Then
       For i = 0 To 7
           strDblHex = strDblHex & B(7 - i)
       Next
       dblDate = HexToDouble(strDblHex)
       dtD = CDate(dblDate)
       Debug.Print dtD
    End If
End Sub

Function HexToDouble(hexValue As String) As Double
    ' refers to IEEE 754
    '
    ' Separate sign, exponent, mantissa and Calculate exponent and fraction values
    Dim intSign As Integer
    Dim lngExp As Long
    Dim lngHexSignVal As Long
    Dim dblMantissa As Double
    Dim strMantissaHex As String
    Dim i As Long, j As Long, k As Long, m As Long
    
    intSign = (CLng("&H0" & Left(hexValue, 1)) And 8) / 8
    lngExp = (CLng("&H" & Left(hexValue, 2)) And 127) * 16 + CLng("&H" & Mid(hexValue, 3, 1))
    lngExp = lngExp - 1023  'Subtract BIAS
  
    strMantissaHex = Mid(hexValue, 4, 13)
    dblMantissa = 1
    
    For i = 1 To Len(strMantissaHex)
        lngHexSignVal = CLng("&H" & Mid(strMantissaHex, i, 1))
        For j = 0 To 3
           k = (i - 1) * 4 + j + 1
           m = 3 - j
           dblMantissa = dblMantissa + ((lngHexSignVal And 2 ^ m) / (2 ^ m)) * (2 ^ -k)
        Next
    Next
    
    ' Calculate double value
    Dim result As Double
    result = (-1) ^ intSign * dblMantissa * 2 ^ lngExp
    
    HexToDouble = result
End Function



AW: Hallo Planlos
20.05.2023 13:14:01
Planlos
1. Ja geht auch ohne benutzerdefinierte Datentypen, man könnte auch z.B. Copymemory nehmen, bekanntlich führen viele Wege nach Rom.
2. Du hattest nach nem Datum gefragt.
3. Nö weil Date und Double technisch das gleiche sind, nur kommen dann beim compilieren andere Regeln für die Eingabe und Ausgabe der Werte zum tragen


AW: Hallo Planlos
21.05.2023 00:15:01
Pappawinni
ich poste jetzt halt doch noch meine Umkehrung in der "zu Fuß"-Variante,
also Wandlung Double-Wert zur HEX-Repräsentation der Double...


Sub testDoubleToHex()
    
    Dim i As Long
    Dim d As Double
    Dim strDHex As String
    Dim strResult As String
    
    d = DateSerial(2023, 5, 17) + TimeSerial(8, 0, 0)
    strDHex = DoubleToHex(d)
    
    Debug.Print strDHex
    
    For i = 0 To 14 Step 2
        strResult = strResult & Mid(strDHex, 15 - i, 2) & IIf(i  14, ", ", "")
    Next
    
    Debug.Print strResult
    
End Sub

Function DoubleToHex(dblValue As Double) As String
    ' see also IEEE 754
    '
    '
    Dim lngExp As Long
    Dim dblMantissa As Double, dblDiv As Double
    Dim strMantissaHex As String
    Dim strExpHex As String
    Dim lngNibble As Long
    Dim i As Long, j As Long, k As Long
    
    lngExp = Int(Log(Abs(dblValue)) / Log(2#))
    dblMantissa = Abs(dblValue) / (2 ^ lngExp) - 1

    lngExp = lngExp + IIf(dblValue  0, 3071, 1023)      'exponent including bias and sign
    strExpHex = hex(lngExp)
            
    k = 0
    For i = 1 To 13
        lngNibble = 0
        For j = 3 To 0 Step -1
            k = k - 1
            dblDiv = 2 ^ k
            If (dblMantissa / dblDiv) >= 1# Then
                lngNibble = lngNibble + 2 ^ j
                dblMantissa = dblMantissa - dblDiv
            End If
        Next
        strMantissaHex = strMantissaHex & hex(lngNibble)
    Next
    DoubleToHex = strExpHex & strMantissaHex
End Function



AW: Genial
18.05.2023 17:16:54
Pappawinni
Hab mich erst gewundert, dass ich ein anderes Datum raus bring, aber da war in dem Code einmal AE statt ea...


Option Explicit

Type dd
d As Date
End Type

Type ss
s As String * 4
End Type

Sub test()
    Dim strHex As String
    Dim dd As dd
    Dim ss As ss
    Dim d As Date
    Dim i As Long
    Dim B() As String
    strHex = "ab,aa,aa,aa,ea,00,e6,40"
    B = Split(strHex, ",")
    For i = 0 To UBound(B)
        B(i) = "&H" & B(i)
    Next
    If UBound(B) >= 7 Then
        ss.s = ChrB(B(0)) & ChrB(B(1)) & ChrB(B(2)) & ChrB(B(3)) & ChrB(B(4)) & ChrB(B(5)) & ChrB(B(6)) & ChrB(B(7))
        LSet dd = ss
        d = CDate(dd.d)
        Debug.Print d
    End If
End Sub



AW: Genial
18.05.2023 17:46:21
Joschi Witchcraft
Hallo Planlos, hallo Pappawinni.

Danke für Euren Code.

In dem Code sind einige Dinge, die mir bisher "nicht über den Weg gelaufen sind". Damit muss ich mich demnächst beschäftigen, um den Code zu verstehen.

Jetzt habe ich eine Muster, wie ich den HEX-String in ein lesbares Datum umwandeln kann, auch wenn ich den Code derzeit noch nicht ganz verstehe,

Danke. Problem gelöst.

Gruß Joschi


AW: Genial
19.05.2023 15:39:02
Der Steuerfuzzi
Hallo Fennek,

im Prinzip ist die Bitfolge die Binärrepresentation eines 64 bit Double-Werts. Wenn man die Binärzahl in Double umwandelt, so kommt 45 063,3333333 heraus, was dann wiederum das Excel-Datum 17.05.2023 08:00 Uhr ist. "Umrechnen" kann man das ganze hier: https://binaryconvert.com/convert_double.html
Wenn Du die Hexwerte (in umgekehrter Reihenfolge) hier eingibst, bekommst Du den Double-Wert heraus.

Gruß
Michael


AW: Danke
19.05.2023 16:02:50
Fennek
Hallo Steuerfuzzi,

danke, das bekommt einen Ehrenplatz in der Sammlung skuriler Zeitstempel.

mfg


AW: Danke
19.05.2023 17:13:43
Der Steuerfuzzi
Na ja, so skurril ist das ja nicht. Es ist ja genau der Datumswert aus Excel. Das Datum wird binär als Gleitkommazahl (die gleiche Zahl, die Excel ausgibt, wenn man das Datum als Zahl mit Nachkommastellen formatiert) gespeichert (https://de.wikipedia.org/wiki/IEEE_754). Nicht mehr nicht weniger.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige