
Кодирование и декодирование чисел по алгоритму Base58
Base58 - вариант кодирования чисел в виде буквенно-цифрового текста на основе цифр и символов латинского алфавита. Алфавит Base58, как можно догадаться из названия, содержит 58 символов. Base58 был разработан для передачи данных и уменьшения количества ошибок у пользователей, которые вручную вводят данные на основе распечатанного текста или фотографии, то есть без возможности машинного копирования и вставки. Так, к примеру, Base58 используется для кодирования идентификаторов кошельков Bitcoin, для создания коротких ссылок на фотохостингах и т.п. В отличие от кодирования Base64, позволяющего работать с неограниченными объемами двоичных данных, Base58 предназначен для кодирования только одиночных числовых значений.Согласно спецификации, в алфавит Base58 не входят буквенно-цифровые символы, которые имеют сходное написание и могут неоднозначно восприниматься человеком (например, буква "О" и цифра "0"), а также символы, используемые при формировании URL. Вместе с тем, порядок следования символов в алфавите ничем не регламентирован, зависит только от сферы применения кодирования и может быть любым. Для этой статьи я выбрал следующий алфавит Base58:
Code (Assembler) : Убрать нумерацию
- alpha db '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
- alpha_len=$-alpha
Теперь переходим к функции кодирования. Из-за использования 32-битной математики, максимальное значение, доступное для кодирования, не может превышать 0xFFFFFFFFh
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------
- ; Кодирование числа по алгоритму Base58
- ;-----------------------------------------------------
- proc base58_encode dValue:DWORD, szOut:DWORD
- pusha
- mov edi,[szOut]
- mov eax,[dValue]
- mov ecx,alpha_len
- @@:
- xor edx,edx
- div ecx
- push eax
- mov al,byte [alpha+edx]
- stosb
- pop eax
- or eax,eax
- jnz @b
- stosb
- popa
- ret
- endp
А вот функция для обратного декодирования строки из Base58 в числовое значение:
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------
- ; Декодирование строки в число по алгоритму Base58
- ;-----------------------------------------------------