elexy 发表于 2011-10-15 16:49:20

请高手修改一下一小段代码,实现反查功能

本帖最后由 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

happytc 发表于 2011-10-15 16:49:21



#include <Array.au3>

Local $aNumber = [29868454617, _
                                        29974127865, _
                                        5275986297, _
                                        12438936825, _
                                        21146066169, _
                                        3353135721]
Local $aString                                       

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, $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

tryhi 发表于 2011-10-15 20:16:47

看了一半,发现楼上给出代码了,就不写了,这个其实是一个36进制转成10进制,再将10进制恢复成36进制的一个算法。

Duvet 发表于 2011-10-29 12:54:35

本帖最后由 Duvet 于 2011-10-29 13:33 编辑

回复 2# happytc
發現錯誤

Local $Output =
Local $Temp
For $Temp In $Output
        ConsoleWrite(_Num2Str($Temp) & @CRLF)
Next


以下是我的方式
**** Hidden Message *****

happytc 发表于 2011-10-29 13:08:14

本帖最后由 happytc 于 2011-10-29 13:34 编辑

回复 4# Duvet

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


Local $Output =
Local $Temp
For $Temp In $Output
        ConsoleWrite(_Num2Str($Temp) & @CRLF)
Next

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

        Local $aNum, $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 = $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

happytc 发表于 2011-10-29 13:20:44

回复happytc
發現錯誤


以下是我的方式
**** 本内容被作者隐藏 ****
Duvet 发表于 2011-10-29 12:54 http://www.autoitx.com/images/common/back.gif

看了下你的,你用了幂函数,效率肯定要差点了

Duvet 发表于 2011-10-29 13:31:54

回复 5# happytc
抱歉,我的疏忽,應該是
Local $Output =

happytc 发表于 2011-10-29 13:35:44

本帖最后由 happytc 于 2011-10-29 13:36 编辑

回复happytc
抱歉,我的疏忽,應該是
Local $Output =
Duvet 发表于 2011-10-29 13:31 http://www.autoitx.com/images/common/back.gif


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


原来的代码,敲的时候,漏打了个等号
页: [1]
查看完整版本: 请高手修改一下一小段代码,实现反查功能