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
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
Das wird nicht so einfach funktionieren, da Int64 = signed integer (also vorzeichenbehaftet).
Da musst Du wohl auf die BigInt-UDF (Suche) ausweichen.
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
Quelle: Windows XP calc.exe
$Hex = "0xCD4C18F701001001"
MsgBox(0, "Ergebnis:", Number(Binary($Hex)))
Exit
; 76561202105830605
Falls du es auch abspeichern willst als Variable so:
[autoit]
dllstructcreate("uint64")
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
#include "BigNum.au3"
[/autoit][autoit][/autoit][autoit]$sHex = "0xCD4C18F701001001"
ConsoleWrite(_Hex2Dec($sHex) & @CRLF)
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
"CD4C18F701001001" =>
#Region Include
#Include <String.au3>
#Include <Array.au3>
#EndRegion Include
AutoItSetOption("MustDeclareVars", 1)
[/autoit] [autoit][/autoit] [autoit]#Region Main
;Local $s_hex = "CD4C18F701001001", _
; $s_bin = _HexToBin($s_hex), _
; $s_dec = _BinToDec($s_bin)
Local $s_hex = "CD4C18F701001001", _
$s_dec = _HexToDec($s_hex) ; $s_dec = 14793226325158006785
#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
#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
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
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
#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
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
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
=> 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]der gevatter hats gelöst (post 4)
au man war das wieder eine einfache lösung
danke ebenso an alle beteiligten für die bemühungen.