Profifrage(?):Aus einem 8 Byte hex string den uint64 ermitteln.

  • ich würde gerne wissen wie ich aus hex strings (in den dem fall 64 bit):
    CD 4C 18 F7 01 00 10 01
    den uint ermitteln kann ? dieser müsste so lauten:
    76561202105830605

    danke :D

    Einmal editiert, zuletzt von WhiteLion (31. Oktober 2010 um 17:00)

  • CD 4C 18 F7 01 00 10 01
    den uint ermitteln kann ? dieser müsste so lauten:
    76561202105830605


    Für Hex: CD4C18F701001001
    Erhalte ich Dec: 14793226325158006785
    8|

    Quelle: Windows XP calc.exe

  • [autoit]

    $Hex = "0xCD4C18F701001001"
    MsgBox(0, "Ergebnis:", Number(Binary($Hex)))
    Exit
    ; 76561202105830605

    [/autoit]
  • Falls du es auch abspeichern willst als Variable so:

    [autoit]


    dllstructcreate("uint64")

    [/autoit]


    Natuürlich ist das nur zum erstellen, zuweisen solltest du mit dem hier drüber und der Hilfe schaffen

    EDIT: ich bin mir nict sicher ob Binary nicht den String nochmal in Hex umwandelt, also eher BinaryToString oder eine eigene Funktion zum umwandeln

  • Klarstellung: Oscar hat natürlich recht, AutoIt kann ohne BigNum.au3 numerisch nur den Bereich von Int64 darstellen. Für das gegebene Beispiel ist der Maximalwert deshalb 0xFFFFFFFFFFFFFF7F:

    [autoit]

    $Hex = "0xFFFFFFFFFFFFFF80"
    $BigNum = "0x" & StringRight($Hex, 2)
    If Number($BigNum) > 0x7F Then
    MsgBox(0, "Fehler!", "BigNum-UDF wird benötigt!")
    Else
    $Int64 = Number(Binary($Hex))
    MsgBox(0, "Ergebnis:", "Hex:" & @TAB & $Hex & @CRLF & _
    "(U)Int64:" & @TAB & $Int64)
    EndIf

    [/autoit]
  • [autoit]

    #include "BigNum.au3"

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

    $sHex = "0xCD4C18F701001001"
    ConsoleWrite(_Hex2Dec($sHex) & @CRLF)

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

    Func _Hex2Dec($sHex)
    If StringLeft($sHex, 2) = "0x" Then $sHex = StringTrimLeft($sHex, 2)
    Local $sRes = "0", $sTmp, $iCnt = -1
    Local $iLen = StringLen($sHex)
    For $i = 1 To $iLen Step 6
    $iCnt += 1
    $sTmp = StringRight($sHex, 6)
    $sHex = StringTrimRight($sHex, 6)
    $sTmp = _BigNum_Mul(Dec($sTmp), _BigNum_Pow(16777216, $iCnt))
    $sRes = _BigNum_Add($sRes, $sTmp)
    Next
    Return $sRes
    EndFunc ;==>_Hex2Dec

    [/autoit]
  • "CD4C18F701001001" =>

    umwandeln
    [autoit]


    #Region Include
    #Include <String.au3>
    #Include <Array.au3>
    #EndRegion Include

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

    AutoItSetOption("MustDeclareVars", 1)

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

    #Region Main
    ;Local $s_hex = "CD4C18F701001001", _
    ; $s_bin = _HexToBin($s_hex), _
    ; $s_dec = _BinToDec($s_bin)

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

    Local $s_hex = "CD4C18F701001001", _
    $s_dec = _HexToDec($s_hex) ; $s_dec = 14793226325158006785

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

    #Region Ausgabe
    ClipPut($s_dec)
    MsgBox(0, "Hex to Dec", "Hex: 0x" & $s_hex & @CRLF & "Dec: " & $s_dec & @CRLF & @CRLF & "Dec copied to clipboard!")
    #EndRegion Ausgabe
    #EndRegion Main

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

    #Region Function
    #Region myBigNum
    Func _Pow($s_basis, $s_exp)
    Local $i_exp = Int($s_exp), _
    $s_potenz = "1"
    For $i = 1 To $i_exp
    $s_potenz = _Mult($s_potenz, $s_basis)
    Next
    Return $s_potenz
    EndFunc

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

    Func _Mult($s_mult1, $s_mult2)
    Local $a_mult1 = StringSplit($s_mult1, "", 2), _
    $a_mult2 = StringSplit($s_mult2, "", 2), _
    $a_mult2_temp = $a_mult2, _
    $s_ergebnis = "", _
    $s_zwischen_ergebnis = "", _
    $i_count = 0, _
    $i_uebertrag = 0, _
    $i_zahl1 = 0, _
    $i_zahl2 = 0, _
    $i_produkt = 0, _
    $i_prod_cut = 0
    While 1
    $i_uebertrag = 0
    $s_zwischen_ergebnis = _StringRepeat("0", $i_count)
    $i_zahl1 = _ArrayPop($a_mult1)
    If @error Then ExitLoop
    $a_mult2_temp = $a_mult2
    While 1
    $i_zahl2 = _ArrayPop($a_mult2_temp)
    If @error Then ExitLoop
    $i_produkt = $i_zahl1 * $i_zahl2 + $i_uebertrag
    $i_prod_cut = Mod($i_produkt, 10)
    $i_uebertrag = Int($i_produkt / 10)
    $s_zwischen_ergebnis = $i_prod_cut & $s_zwischen_ergebnis
    WEnd
    If $i_uebertrag Then $s_zwischen_ergebnis = $i_uebertrag & $s_zwischen_ergebnis
    $s_ergebnis = _Add($s_ergebnis, $s_zwischen_ergebnis)
    $i_count += 1
    WEnd
    Return $s_ergebnis
    EndFunc

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

    Func _Add($s_add1, $s_add2)
    Local $i_add1 = StringLen($s_add1), _
    $i_add2 = StringLen($s_add2)
    Select
    Case $i_add1 < $i_add2
    $s_add1 = _StringRepeat("0", $i_add2 - $i_add1) & $s_add1
    Case $i_add1 > $i_add2
    $s_add2 = _StringRepeat("0", $i_add1 - $i_add2) & $s_add2
    EndSelect
    Local $a_add1 = StringSplit($s_add1, "", 2), _
    $a_add2 = StringSplit($s_add2, "", 2), _
    $s_ergebnis = "", _
    $i_uebertrag = 0, _
    $i_zahl1 = 0, _
    $i_zahl2 = 0, _
    $i_sum = 0
    While 1
    $i_zahl1 = _ArrayPop($a_add1)
    $i_zahl2 = _ArrayPop($a_add2)
    If @error Then ExitLoop
    $i_sum = $i_zahl1 + $i_zahl2 + $i_uebertrag
    $i_uebertrag = 0
    If $i_sum > 9 Then
    $i_uebertrag = 1
    $i_sum -= 10
    EndIf
    $s_ergebnis = $i_sum & $s_ergebnis
    WEnd
    If $i_uebertrag Then $s_ergebnis = $i_uebertrag & $s_ergebnis
    Return $s_ergebnis
    EndFunc
    #EndRegion myBigNum

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

    #Region Hex->Bin->Dec Converter
    Func _HexToBin($s_hex)
    Local $a_hex = StringSplit($s_hex, "", 2), _
    $s_bin = "", _
    $s_basis = "2", _
    $i_dec = 0, _
    $i_val = 0
    For $s_hex In $a_hex
    $i_dec = Dec($s_hex)
    For $i_exp = 3 To 0 Step -1
    $i_val = $i_dec - ($s_basis^$i_exp)
    If $i_val >= 0 Then
    $s_bin &= 1
    $i_dec = $i_val
    Else
    $s_bin &= 0
    EndIf
    Next
    Next
    Return $s_bin
    EndFunc

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

    Func _BinToDec($s_bin)
    Local $a_bin = StringSplit($s_bin, "", 2), _
    $s_dec = "0", _
    $s_basis = "2", _
    $s_potenz = "1", _
    $i_exp = 0
    _ArrayReverse($a_bin)
    For $s_bit In $a_bin
    Switch $i_exp
    Case 0
    Case Else
    $s_potenz = _Mult($s_potenz, $s_basis)
    EndSwitch
    If $s_bit = "1" Then $s_dec = _Add($s_dec, $s_potenz)
    $i_exp += 1
    Next
    Return $s_dec
    EndFunc

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

    Func _HexToDec($s_hex)
    Local $a_hex = StringSplit($s_hex, "", 2), _
    $s_dec = "0", _
    $s_basis = "16", _
    $s_potenz = "1", _
    $i_exp = 0
    _ArrayReverse($a_hex)
    For $s_hex In $a_hex
    Switch $i_exp
    Case 0
    Case Else
    $s_potenz = _Mult($s_potenz, $s_basis)
    EndSwitch
    If Not ($s_hex = "0") Then $s_dec = _Add($s_dec, _Mult($s_potenz, Dec($s_hex)))
    $i_exp += 1
    Next
    Return $s_dec
    EndFunc
    #EndRegion Hex->Bin->Dec Convert
    #EndRegion Function

    [/autoit]


    => 14793226325158006785

  • Guten Morgen,

    das gewünschte Ergebnis ist aber 76561202105830605 und nicht 14793226325158006785. Ich würde mal schätzen, dass der Wert direkt aus dem Speicher ausgelesen wurde (Bytefolge der X86-Prozessoren). Der passende AutoIt-Hexstring wäre demnach:

    [autoit]

    $Hex = "0x01100001F7184CCD"

    [/autoit]