(VB6)将32位长转换为字符串* 6 [A-Z]

时间:2009-01-24 15:39:56

标签: vb6 bit-manipulation

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

使用VB6(不要问!)。

我已经计算出一个字母使用5位,所以我可以从32位长的字母中获得6个字母。

任何人都可以给我一个关于如何做到这一点的指针,因为我不知道。

3 个答案:

答案 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个字母   长。

  • 您可以将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

答案 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