0

我希望将 32 位 Long 转换为 String*6,它只使用字符 [AZ]。

使用 VB6(不要问!)。

我计算出单个字母使用 5 位,所以我可以从 32 位长中得到 6 个字母。

谁能给我一个关于如何做到这一点的指针,因为我不知道。

4

3 回答 3

1

你的数学有严重缺陷。5 位 x 6 个字母 = 30 位,比您需要的少 2 位。另外,5 位需要 2 ^ 5 = 32 个代码,你只有 26 个(AZ)。鉴于您想要 AZ,您只能编码 4 位。这需要 32 / 4 = 8 个字母。如果你用十六进制编码,你会得到多少。

使用 Hex() 函数和 String*8。

于 2009-01-24T16:06:45.903 回答
0

单个字母使用 5 位

  • 正确的

我可以从 32 位长中得到 6 个字母。

  • 您可以将 6 个字母编码为 32 位长。

但这并不意味着您可以将每 32 位长度编码为 6 个字母。

因为 32^6 (1,073,741,824) < 2^32 (4,294,967,296)

这甚至假设每个字符有 32 个可能的值(5 位)。

26 个字母(小于 32 位)更糟糕:26^6 = 308,915,776

于 2009-01-24T17:15:11.070 回答
0

这两个功能应该让你接近你想要的。第一个使用数字和字母。只有第二个字母。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
于 2009-01-26T13:30:35.257 回答