找回密码
 加入
搜索
查看: 2734|回复: 6

[AU3基础] 请高手修改一下一小段代码,实现反查功能

  [复制链接]
发表于 2011-10-15 16:49:20 | 显示全部楼层 |阅读模式
悬赏100金钱已解决
本帖最后由 elexy 于 2011-10-17 08:11 编辑
local $Output = "BKRT23X"
Local $code = 0
Local $ChrSerial = 0
$strTag = StringToASCIIArray($Output)
For $i = 0 To UBound($strTag) - 1
        $ChrSerial = $strTag[$i]
        If $ChrSerial > 47 And $ChrSerial < 58 Then
                $ChrSerial -= 48
        ElseIf $ChrSerial > 64 And $ChrSerial < 91 Then
                $ChrSerial -= 55
        Else
                ExitLoop
        EndIf
        $code = $code + 36 ^ (UBound($strTag) - $i - 1) * $ChrSerial
Next

MsgBox(64,"",$code) 
结果为25200634605, 现在需要反查,意思就是 知道$code = 25200634605 反查  $Output 的值。

可以做到批量,即逐行读取脚本目录下code.txt文本,转换后逐行生成 Output.txt

数学底子太薄,请众高手帮衬一下。


code.txt文件内容范例:

29868454617
29974127865
5275986297
12438936825
21146066169
3353135721

最佳答案

查看完整内容

[au3] #include Local $aNumber[6] = [29868454617, _ 29974127865, _ 5275986297, _ 12438936825, _ 21146066169, _ 3353135721] Local $aString[UBound($aNumber)] For $i = 0 To UBound($aNumber) - 1 $aString[$i] = _Num2Str($aNumber[$i]) Next _ArrayDisplay($aString) Func _Num2Str($Sum) If Not IsInt($Sum) Then Return 0 Local $aNum[1], $i = -1 While True $i += 1 ...
发表于 2011-10-15 16:49:21 | 显示全部楼层


#include <Array.au3>

Local $aNumber[6] = [29868454617, _
                                        29974127865, _
                                        5275986297, _
                                        12438936825, _
                                        21146066169, _
                                        3353135721]
Local $aString[UBound($aNumber)]                                        

For $i = 0 To UBound($aNumber) - 1
        $aString[$i] = _Num2Str($aNumber[$i])
Next

_ArrayDisplay($aString)


Func _Num2Str($Sum)
        If Not IsInt($Sum) Then Return 0
        
        Local $aNum[1], $i = -1
        While True
                $i += 1
                If $Sum > 36 Then
                        If $i > 0 Then
                                ReDim $aNum[$i + 1]
                                $Sum = ($Sum - $aNum[$i - 1]) / 36
                                $aNum[$i] = Mod($Sum, 36)
                        Else
                                $aNum[$i] = Mod($Sum, 36)
                        EndIf
                Else
                        ExitLoop
                EndIf
        WEnd

        Local $Suffix = UBound($aNum), $aStr[$Suffix], $AllStr = ""

        For $i = $Suffix - 1 To 0 Step -1
                Switch $aNum[$i]
                        Case 0 To 9
                                $aStr[$Suffix - $i - 1] = $aNum[$i]
                        Case Else
                                $aStr[$Suffix - $i - 1] = Chr($aNum[$i] + 55)
                EndSwitch
        Next

        For $i = 0 To $Suffix - 1
                $AllStr &= $aStr[$i]
        Next
        
        Return $AllStr
EndFunc

发表于 2011-10-15 20:16:47 | 显示全部楼层
看了一半,发现楼上给出代码了,就不写了,这个其实是一个36进制转成10进制,再将10进制恢复成36进制的一个算法。
发表于 2011-10-29 12:54:35 | 显示全部楼层
本帖最后由 Duvet 于 2011-10-29 13:33 编辑

回复 2# happytc
發現錯誤

Local $Output[3] = [0, 1, 10]
Local $Temp
For $Temp In $Output
        ConsoleWrite(_Num2Str($Temp) & @CRLF)
Next


以下是我的方式
游客,如果您要查看本帖隐藏内容请回复
发表于 2011-10-29 13:08:14 | 显示全部楼层
本帖最后由 happytc 于 2011-10-29 13:34 编辑

回复 4# Duvet

因为楼主是加密的,所以搞数字仅仅小于36的,毫无意义了
若真的你说的这样,也仅仅需要加上一行就可以了


Local $Output[3] = [0, 1, 10]
Local $Temp
For $Temp In $Output
        ConsoleWrite(_Num2Str($Temp) & @CRLF)
Next

Func _Num2Str($Sum)
        If Not IsInt($Sum) Then Return 0

        Local $aNum[1], $i = -1
        While True
                $i += 1
                If $Sum >= 36 Then
                        If $i > 0 Then
                                ReDim $aNum[$i + 1]
                                $Sum = ($Sum - $aNum[$i - 1]) / 36
                                $aNum[$i] = Mod($Sum, 36)
                        Else
                                $aNum[$i] = Mod($Sum, 36)
                        EndIf
                Else
                        If $i == 0 Then $aNum[0] = $Sum ;加上此行
                        ExitLoop
                EndIf
        WEnd

        Local $Suffix = UBound($aNum), $aStr[$Suffix], $AllStr = ""

        For $i = $Suffix - 1 To 0 Step -1
                Switch $aNum[$i]
                        Case 0 To 9
                                $aStr[$Suffix - $i - 1] = $aNum[$i]
                        Case Else
                                $aStr[$Suffix - $i - 1] = Chr($aNum[$i] + 55)
                EndSwitch
        Next

        For $i = 0 To $Suffix - 1
                $AllStr &= $aStr[$i]
        Next

        Return $AllStr
EndFunc   ;==>_Num2Str
发表于 2011-10-29 13:20:44 | 显示全部楼层
回复  happytc
發現錯誤


以下是我的方式
**** 本内容被作者隐藏 ****
Duvet 发表于 2011-10-29 12:54


看了下你的,你用了幂函数,效率肯定要差点了
发表于 2011-10-29 13:31:54 | 显示全部楼层
回复 5# happytc
抱歉,我的疏忽,應該是
Local $Output[3] = [0, 36, 1296]
发表于 2011-10-29 13:35:44 | 显示全部楼层
本帖最后由 happytc 于 2011-10-29 13:36 编辑
回复  happytc
抱歉,我的疏忽,應該是
Local $Output[3] = [0, 36, 1296]
Duvet 发表于 2011-10-29 13:31



    如5楼的代码,把
If $Sum > 36 Then 改成
If $Sum >= 36 Then就可以了


原来的代码,敲的时候,漏打了个等号
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-10 21:42 , Processed in 0.084751 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表