我希望将 32 位 Long 转换为 String*6,它只使用字符 [AZ]。
使用 VB6(不要问!)。
我计算出单个字母使用 5 位,所以我可以从 32 位长中得到 6 个字母。
谁能给我一个关于如何做到这一点的指针,因为我不知道。
我希望将 32 位 Long 转换为 String*6,它只使用字符 [AZ]。
使用 VB6(不要问!)。
我计算出单个字母使用 5 位,所以我可以从 32 位长中得到 6 个字母。
谁能给我一个关于如何做到这一点的指针,因为我不知道。
你的数学有严重缺陷。5 位 x 6 个字母 = 30 位,比您需要的少 2 位。另外,5 位需要 2 ^ 5 = 32 个代码,你只有 26 个(AZ)。鉴于您想要 AZ,您只能编码 4 位。这需要 32 / 4 = 8 个字母。如果你用十六进制编码,你会得到多少。
使用 Hex() 函数和 String*8。
单个字母使用 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
这两个功能应该让你接近你想要的。第一个使用数字和字母。只有第二个字母。MaxChar 是您要使用比例尺 01234567890ABCDEFGHIGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 使用的字母数。Alpha only 不使用 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