我有一个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
答案 0 :(得分:2)
您的第一个过程中有一笔款项
N1 = N1 + n11 * 64
因此公式无法还原!
假设您有一笔5 + 4 = 10
。然后,如果您仅知道和10
并且想知道a + b = 10
,那么就无法还原它,那么a
和b
就有多个解决方案(实际上有无限大解决方案)。
因此,答案是:您的十六进制代码无法还原为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。