我希望将32位Long转换为String * 6,它只使用字符[A-Z]。
使用VB6(不要问!)。
我已经计算出一个字母使用5位,所以我可以从32位长的字母中获得6个字母。
任何人都可以给我一个关于如何做到这一点的指针,因为我不知道。
答案 0 :(得分:1)
你的数学存在严重缺陷。 5位x 6个字母= 30位,2你所需要的。另外,5位需要2 ^ 5 = 32个代码,你只有26(A-Z)。鉴于您需要A-Z,您只能编码4位。这需要32/4 = 8个字母。如果用十六进制编码,那么就像你得到的一样多。
使用Hex()函数和String * 8。
答案 1 :(得分:0)
单个字母使用5位
我可以从32位中获得6个字母 长。
但这并不意味着你可以将每个32位长编码为6个字母。
因为32 ^ 6(1,073,741,824)< 2 ^ 32(4,294,967,296)
甚至假设每个字符有32个可能的值(5位)。
26个字母(小于32位)更糟糕:26 ^ 6 = 308,915,776
答案 2 :(得分:0)
这两个功能可以让你接近你想要的。第一个使用数字和字母。第二个只是字母。 MaxChar是您想要使用的标尺数量01234567890ABCDEFGHIGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz。 Alpha仅不使用0到9.
Public Function PackNumber(ByVal Value As Long, ByVal MaxChar As Integer, ByRef IsNeg As Boolean) As String
Dim CurValue As Currency
Dim CharValue As Integer
Dim sPacked As String
If Sgn(n) = -1 Then
IsNeg = True
CurValue = -Value
Else
IsNeg = False
CurValue = Value
End If
sPacked = ""
Do Until Abs(CurValue) <= MaxChar
CharValue = MaxChar * ((CurValue / MaxChar) - Int(CurValue / MaxChar))
CurValue = Int(CurValue / MaxChar)
If CharValue < 10 Then
sPacked = CharValue & sPacked
ElseIf CharValue <= 36 Then
sPacked = Chr(55 + CharValue) & sPacked
Else
sPacked = Chr(60 + CharValue) & sPacked
End If
Loop
CharValue = CurValue
If CharValue < 10 Then
sPacked = CStr(CharValue) & sPacked
ElseIf CharValue <= 36 Then
sPacked = Chr(55 + CharValue) & sPacked
Else
sPacked = Chr(60 + CharValue) & sPacked
End If
PackNumber = sPacked
End Function
仅Alpha功能
Public Function PackNumberAlphaOnly(ByVal Value As Long, ByVal MaxChar As Integer, ByRef IsNeg As Boolean) As String
Dim CurValue As Currency
Dim CharValue As Integer
Dim sPacked As String
If Sgn(Value) = -1 Then
IsNeg = True
CurValue = -Value
Else
IsNeg = False
CurValue = Value
End If
sPacked = ""
Do Until Abs(CurValue) <= MaxChar
CharValue = MaxChar * ((CurValue / MaxChar) - Int(CurValue / MaxChar))
CurValue = Int(CurValue / MaxChar)
If CharValue <= 26 Then
sPacked = Chr(65 + CharValue) & sPacked
Else
sPacked = Chr(70 + CharValue) & sPacked
End If
Loop
CharValue = CurValue
If CharValue <= 26 Then
sPacked = Chr(65 + CharValue) & sPacked
Else
sPacked = Chr(70 + CharValue) & sPacked
End If
PackNumberAlphaOnly = sPacked
End Function