32 ビットの Long を [AZ] のみを使用する String*6 に変換したいと考えています。
VB6 を使用する (聞かないでください!)。
1 文字で 5 ビットを使用すると計算したので、32 ビットの長さから 6 文字を取得できます。
手がかりがないので、誰かがこれを行う方法についての指針を教えてもらえますか。
32 ビットの Long を [AZ] のみを使用する String*6 に変換したいと考えています。
VB6 を使用する (聞かないでください!)。
1 文字で 5 ビットを使用すると計算したので、32 ビットの長さから 6 文字を取得できます。
手がかりがないので、誰かがこれを行う方法についての指針を教えてもらえますか。
あなたの計算には深刻な欠陥があります。5 ビット x 6 文字 = 30 ビット、必要なものの 2 恥ずかしがり屋です。さらに、5 ビットには 2 ^ 5 = 32 コードが必要で、26 (AZ) しかありません。AZ が必要な場合、4 ビットしかエンコードできません。これには 32 / 4 = 8 文字が必要です。16 進数でエンコードした場合とまったく同じ数です。
Hex() 関数と String*8 を使用します。
この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
1 文字は 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