; Author : @eukalyptus ; 24. Januar 2014 ; Link : https://autoit.de/index.php?thread/28809-suche-schnelle-funktion-zum-umrechnen-ins-dual-oder-hexadezimalsystem/&postID=355460#post355460 ; ; Modified by @Musashi (2019-03-15) ; _BigNum_DecToBin returns an empty Binarystring if Decimalstring = "0" *** fixed $sDec = "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" $iTimer = TimerInit() $sBin = _BigNum_DecToBin($sDec) ConsoleWrite("> Time Decimal To Binary : " & StringFormat("%.2f", TimerDiff($iTimer)) & @CRLF) $iTimer = TimerInit() $sDec2 = _BigNum_BinToDec($sBin) ConsoleWrite("> Time Binary To Decimal : " & StringFormat("%.2f", TimerDiff($iTimer)) & @CRLF) If $sDec2 = $sDec Then ConsoleWrite("+ Richtig : " & @CRLF & "+ $sDec : " & $sDec & @CRLF & "+ $sDec2 : " & $sDec2 & @CRLF & "+ $sBin : " & $sBin & @CRLF & @CRLF) Else ConsoleWrite("+ Falsch : " & @CRLF & "+ $sDec : " & $sDec & @CRLF & "+ $sDec2 : " & $sDec2 & @CRLF & "+ $sBin : " & $sBin & @CRLF & @CRLF) _Compare($sDec, $sDec2) EndIf Func _Compare($sX, $sY) Local $aX = StringSplit($sX, "") Local $aY = StringSplit($sY, "") ConsoleWrite("! ") For $i = 1 To $aX[0] If $aX[$i] = $aY[$i] Then ConsoleWrite("_") Else ConsoleWrite("|") ExitLoop EndIf Next ConsoleWrite(@CRLF) EndFunc ;==>_Compare Func _BigNum_DecToBin($sDec) Local $tChr = DllStructCreate("char[65];") Local $sRet = "" If ($sDec == "0") Then Return("0") ; *** added by @Musashi While Not ($sDec = "0") DllCall("msvcrt.dll", "ptr:cdecl", "_i64toa", "int64", __BigNum_DecToBinDiv($sDec), "struct*", $tChr, "int", 2) $sRet = StringRight("0000000000000000000000000000000000000000000" & DllStructGetData($tChr, 1), 43) & $sRet WEnd Return StringRegExpReplace($sRet, "^0+([^0]|0$)", "\1", 1) EndFunc ;==>_BigNum_DecToBin Func _BigNum_BinToDec($sBin) Local Const $cPOT = 32 Local Const $cDVS = Int(2 ^ $cPOT) Local $aBin = StringRegExp($sBin, '\A.{' & $cPOT - (Ceiling(StringLen($sBin) / $cPOT) * $cPOT - StringLen($sBin)) & '}|.{' & $cPOT & '}+', 3) Local $aResult, $sTmp, $sPot = "1", $sDec = "0" For $i = UBound($aBin) - 1 To 0 Step -1 $sTmp = $sPot $aResult = DllCall("msvcrt.dll", "uint64:cdecl", "_strtoui64", "str", $aBin[$i], "ptr", 0, "int", 2) __BigNum_BinToDecMul($sTmp, $aResult[0]) __BigNum_BinToDecAdd($sDec, $sTmp) __BigNum_BinToDecMul($sPot, $cDVS) Next Return StringRegExpReplace($sDec, "^0+([^0]|0$)", "\1", 1) EndFunc ;==>_BigNum_BinToDec Func __BigNum_BinToDecAdd(ByRef $sX, $sY) Local $iTmp = StringLen($sX), $iLen = StringLen($sY), $iCar = 0, $sRet = "" If $iLen < $iTmp Then $iLen = $iTmp For $i = 1 To $iLen Step 18 $iTmp = Int(StringRight($sX, 18)) + Int(StringRight($sY, 18)) + $iCar $sX = StringTrimRight($sX, 18) $sY = StringTrimRight($sY, 18) If ($iTmp > 999999999999999999) Then $iTmp = StringRight($iTmp, 18) $sRet = $iTmp & $sRet $iCar = 1 Else $iTmp = StringRight("000000000000000000" & $iTmp, 18) $sRet = $iTmp & $sRet $iCar = 0 EndIf Next $sX = StringRegExpReplace($iCar & $sRet, "^0+([^0]|0$)", "\1", 1) EndFunc ;==>__BigNum_BinToDecAdd Func __BigNum_BinToDecMul(ByRef $sX, $iY) Local $aX = StringRegExp($sX, '\A.{' & 6 - (Ceiling(StringLen($sX) / 6) * 6 - StringLen($sX)) & '}|.{6}+', 3) For $i = 0 To UBound($aX) - 1 $aX[$i] = Int($aX[$i]) * $iY Next Local $iCar = 0, $iTmp $sX = "" For $i = UBound($aX) - 1 To 0 Step -1 $aX[$i] += $iCar $iCar = Floor($aX[$i] / 1000000) $iTmp = Mod($aX[$i], 1000000) If $iTmp <= 1000000 Then $iTmp = StringRight("000000" & $iTmp, 6) $sX = $iTmp & $sX Next If $iCar > 0 Then $sX = $iCar & $sX $sX = StringRegExpReplace($sX, "^0+([^0]|0$)", "\1", 1) EndFunc ;==>__BigNum_BinToDecMul Func __BigNum_DecToBinDiv(ByRef $sX) Local Const $cDVS = 8796093022208 Local $sRet = "", $iRem = StringLeft($sX, 15), $iTmp = 0, $iTrm = 6, $iLen $sX = StringTrimLeft($sX, 15) $iTmp = Floor($iRem / $cDVS) $sRet &= $iTmp $iRem -= $iTmp * $cDVS While StringLen($sX) > 0 $iTrm = 15 - StringLen($iRem) $iTmp = StringLeft($sX, $iTrm) $iLen = StringLen($iTmp) $iRem &= $iTmp $sX = StringTrimLeft($sX, $iTrm) $iTmp = Floor($iRem / $cDVS) $iTmp = StringRight("000000000000000" & $iTmp, $iLen) $sRet &= $iTmp $iRem -= $iTmp * $cDVS WEnd $sX = StringRegExpReplace($sRet, "^0+([^0]|0$)", "\1", 1) Return $iRem EndFunc ;==>__BigNum_DecToBinDiv