0

32 ビットの Long を [AZ] のみを使用する String*6 に変換したいと考えています。

VB6 を使用する (聞かないでください!)。

1 文字で 5 ビットを使用すると計算したので、32 ビットの長さから 6 文字を取得できます。

手がかりがないので、誰かがこれを行う方法についての指針を教えてもらえますか。

4

3 に答える 3

1

あなたの計算には深刻な欠陥があります。5 ビット x 6 文字 = 30 ビット、必要なものの 2 恥ずかしがり屋です。さらに、5 ビットには 2 ^ 5 = 32 コードが必要で、26 (AZ) しかありません。AZ が必要な場合、4 ビットしかエンコードできません。これには 32 / 4 = 8 文字が必要です。16 進数でエンコードした場合とまったく同じ数です。

Hex() 関数と String*8 を使用します。

于 2009-01-24T16:06:45.903 に答える
0

この2つの関数は、必要なものに近づくはずです。最初のものは数字と文字を使用します。2番目の1文字のみ。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

アルファのみの機能

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 に答える
0

1 文字は 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 に答える