逆向工程Excel公式

时间:2019-01-18 15:23:03

标签: excel vba excel-formula

我有一个excel vba公式,我正试图反转该公式,Sub letterToHex效果很好。但是我无法解决如何逆向工作的最后阶段,以将十六进制代码转换回CPJ。我设法在Sub HextoLetter中获得了前几个阶段的工作

Sub LetterToHex()

R1 = "CPJ"

N1 = Asc(Right(R1, 1)) - 64 ' Result is ASCII value of letter J is  (74) - 64  = 10

N1 = N1 + (Asc(Mid(R1, 2, 1)) - 64) * 64 ' Result is ASCII value of letter P is (80) - 64 * 64 = 1234 + N1 value 10 = 1034

n11 = (Asc(Left(R1, 1)) - 64) * 64 ' Result is ASCII value of letter C (67) - 64 =3 * 64 = 192

N1 = N1 + n11 * 64 ' result is 13322

N1 = N1 + 14680064 ' Result is 14693386

N2 = Hex(N1) 'Result is N2 = E0340A
dec = CLng("&H" & N2)

notfound:

End Sub

Sub HextoLetter()
hexcode = "E0340A"
dec = CLng("&H" & hexcode) '14693386
shortdec = dec - 14680064 '13322

End Sub

我需要完成HextoLetter代码,才能将E0340A十六进制代码转换回CPJ

显示的其他代码

Sub LetterToHex_CPK()

R1 = "CPK"

N1 = Asc(Right(R1, 1)) - 64 ' Result is ASCII value of letter K is  (75) - 64  = 11
MsgBox N1
N1 = N1 + (Asc(Mid(R1, 2, 1)) - 64) * 64 ' Result is ASCII value of letter P is (80) - 64 * 64 = 1234 + N1 value 11 = 1035
MsgBox N1
n11 = (Asc(Left(R1, 1)) - 64) * 64 ' Result is ASCII value of letter C (67) - 64 =3 * 64 = 192
MsgBox n11
N1 = N1 + n11 * 64 ' result is 13323
MsgBox N1
N1 = N1 + 14680064 ' Result is 14693387
MsgBox N1
N2 = Hex(N1) 'Result is N2 = E0340B
MsgBox N2
dec = CLng("&H" & N2)

notfound:

End Sub

2 个答案:

答案 0 :(得分:2)

您的第一个过程中有一笔款项

N1 = N1 + n11 * 64

因此公式无法还原!

说明:

假设您有一笔5 + 4 = 10。然后,如果您仅知道和10并且想知道a + b = 10,那么就无法还原它,那么ab就有多个解决方案(实际上有无限大解决方案)。

因此,答案是:您的十六进制代码无法还原为3个字母。

答案 1 :(得分:2)

  

N1 + n11 * 64

上面可以写成

 N1 = N1 + (n11 * 64)

相同
 N1 + ((Asc(Left(R1, 1)) - 64) * 64)

相同
 (N1 + (Asc(Mid(R1, 2, 1)) - 64) * 64) + ((Asc(Left(R1, 1)) - 64) * 64)

相同
 (Asc(Right(R1, 1)) - 64 + (Asc(Mid(R1, 2, 1)) - 64) * 64) + ((Asc(Left(R1, 1)) - 64) * 64)

在此逻辑的基础上,可能获得所需的内容

这是它的功能

Sub Sample()
    Dim shortdec As Long, dec As Long
    Dim hexcode As String

    hexcode = "E0340A" 
    'hexcode = "E0340B" '<~~ This will give you CPK

    dec = CLng("&H" & hexcode) '14693386
    shortdec = dec - 14680064 '1332

    Debug.Print GetString(shortdec)
End Sub

 Function GetString(n As Long) As String
    Dim i As Long, j As Long, k As Long
    Dim a As Long, b As Long, c As Long
    Dim x As Long

    For i = 65 To 90
        For j = 65 To 90
            For k = 65 To 90
                a = Asc(Chr(i)) - 64
                b = (Asc(Chr(j)) - 64) * 64
                c = (Asc(Chr(k)) - 64) * 64

                x = (a + b) + c * 64
                If x = n Then
                    GetString = Chr(k) & Chr(j) & Chr(i)
                    Exit Function
                End If
            Next k
        Next j
    Next i
 End Function

我的假设:您将使用大写字母。否则,您还必须遍历ASC 97到122。