(VB6) Преобразовать 32-битную строку в строку * 6 [A-Z] - PullRequest
0 голосов
/ 24 января 2009

Я хочу преобразовать 32-битную длину в строку * 6, в которой будут использоваться только символы [A-Z].

Использование VB6 (не спрашивайте!).

Я рассчитал, что одна буква использует 5 битов, поэтому я могу получить 6 букв из 32-битной длины.

Может кто-нибудь дать мне указатель на то, как это сделать, поскольку я понятия не имею.

Ответы [ 3 ]

1 голос
/ 24 января 2009

Ваша математика серьезно испорчена. 5 бит х 6 букв = 30 бит, 2 стесняются того, что вам нужно. Кроме того, для 5 бит требуется 2 ^ 5 = 32 кода, у вас есть только 26 (A-Z). Учитывая, что вы хотите A-Z, вы можете кодировать только 4 бита. Что требует 32/4 = 8 букв. Ровно столько, сколько вы получите, если закодируете в шестнадцатеричном формате.

Используйте функцию Hex () и String * 8.

0 голосов
/ 26 января 2009

Эта две функции должны приблизить вас к тому, что вы хотите. Первый использует цифры и буквы. Второй только буквы. MaxChar - это количество букв, которое вы хотите использовать с использованием шкалы 01234567890ABCDEFGHIGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. Альфа не использует только от 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
0 голосов
/ 24 января 2009

В одной букве используется 5 бит

  • правильный

Я могу получить 6 букв из 32 бит длинный.

  • Вы можете закодировать 6 букв в 32-битную длину.

Но это не значит, что вы можете кодировать каждый 32-битный код длиной в 6 букв.

Потому что 32 ^ 6 (1 073 741 824) <2 ^ 32 (4 294 967 296) </p>

Это даже при условии, что у вас есть 32 возможных значения (5 бит) на символ.

Еще хуже с 26 буквами (что меньше 32 бит): 26 ^ 6 = 308 915 776

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...