请高手修改一下一小段代码,实现反查功能
本帖最后由 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
#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
看了一半,发现楼上给出代码了,就不写了,这个其实是一个36进制转成10进制,再将10进制恢复成36进制的一个算法。 本帖最后由 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: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
發現錯誤
以下是我的方式
**** 本内容被作者隐藏 ****
Duvet 发表于 2011-10-29 12:54 http://www.autoitx.com/images/common/back.gif
看了下你的,你用了幂函数,效率肯定要差点了 回复 5# happytc
抱歉,我的疏忽,應該是
Local $Output = 本帖最后由 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]