Преобразование из базы-32 в десятичную без VBA - PullRequest
2 голосов
/ 20 февраля 2020

Я искал и искал, и мой Google-фу подвел меня. Я пытаюсь преобразовать закодированное число из base-32 в десятичное, используя выражения или макрос, но я ничего не нахожу. Я знаю, что в Excel есть функция «Десятичное число», я надеялся, что смогу наткнуться на что-то подобное.

Я не хочу использовать VBA, поскольку я не хочу тратить время на переучивание языка прямо сейчас, и я боюсь, что моя организация пометит его как потенциально опасный (что может убить мои попытки создание любых баз данных).

При вводе "16O9E55"
я ожидаю результат 1300543653.

Я должен уточнить, что это "base32hex "Согласно Википедии. Это 0-9, AV. Это только 7 символов из базы 32, которые должны быть преобразованы в 10 десятичных знаков. Мой вариант использования - декодирование штрих-кода в нужные мне данные.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Я сомневаюсь, что это может быть достигнуто без VBA. Рассмотрим код, адаптированный из https://www.excelbanter.com/excel-worksheet-functions/150198-formulat-convert-base-32-decimal.html

Public Function Base32ToDec(Num As String) As Variant

Static Digits As String
Dim i As Integer
Dim myIndex As Integer
Dim myStr As String

Digits = "0123456789ABCDEFGHIJKLMNOPQRSTUV"
For i = Len(Num) To 1 Step -1
    myStr = Mid(Num, i, 1)
    myIndex = InStr(Digits, myStr) - 1
    Base32ToDec = Base32ToDec + myIndex * 32 ^ (Len(Num) - i)
Next i

End Function
0 голосов
/ 21 февраля 2020

Согласно Википедии, Base32 использует 32-символьный набор, состоящий из двадцати шести заглавных букв A – Z и цифр 2–7. Вариант base32hex начинается с 0 - 9 и использует буквы от A до V.

Если были закодированы только числа с ограниченным диапазоном, вы можете легко их декодировать с помощью VBA, в противном случае вы могли бы должен вернуть массив байтов и обработать его дальше.

Вы пишете, что у вас есть до 10 десятичных цифр. Вопрос в том, какое максимальное количество. Тип Long может хранить номера до 2,147,483,647. Это десять цифр; однако с 10 цифрами вы можете сохранить число размером 9,999,999,999.

. Следовательно, функция follow возвращает число как Double. Если вы знаете, что ваше число никогда не превысит 2,147,483,647, вы можете заменить Double тип *1016* на переменную sum и тип возвращаемого значения функции.

Public Function DecodeBase32hex(ByVal encoded As String) As Double
    Dim ch As String
    Dim sum As Double
    Dim d As Long, i As Long

    For i = 1 To Len(encoded)
        ch = Mid$(encoded, i, 1)
        If ch >= "A" And ch <= "Z" Then
            d = Asc(ch) - Asc("A") + 10
        ElseIf ch >= "0" And ch <= "9" Then
            d = Asc(ch) - Asc("0")
        Else
            Exit For 'E.g. padding charachters
        End If
        sum = 32 * sum + d
    Next i
    DecodeBase32hex = sum
End Function

Test in Access 'Непосредственное окно:

?DecodeBase32hex("16O9E55")    
 1300543653
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...