Base32 — это метод кодирования, основанный на системе счисления base -32 . Он использует алфавит из 32 цифр , каждая из которых представляет собой различную комбинацию из 5 бит (2 5 ). Поскольку base32 не очень широко принята, вопрос об обозначениях — какие символы использовать для представления 32 цифр — не так урегулирован, как в случае более известных систем счисления (например, шестнадцатеричной ), хотя существуют RFC и неофициальные и фактические стандарты. Одним из способов представления чисел Base32 в понятной для человека форме является использование цифр 0–9, за которыми следуют двадцать две заглавные буквы A–V. Однако в разных контекстах используется множество других вариаций. Исторически код Бодо можно считать модифицированным ( с сохранением состояния ) кодом base32.
В данной статье рассматривается использование Base32 для представления байтовых строк, а не беззнаковых целых чисел, аналогично тому, как работает Base64 .
Предложенный в октябре 2006 года стандарт Интернета [1] RFC 4648 документирует кодировки base16 , base32 и base64. Он включает две схемы для base32, но рекомендует одну из них вместо другой. Он также рекомендует, чтобы независимо от прецедента только алфавит, который он определяет в своем разделе 6, фактически назывался base32, а другой похожий алфавит в его разделе 7 вместо этого назывался base32hex. [a] Согласие с этими рекомендациями не является всеобщим. Необходимо соблюдать осторожность при использовании систем, которые называются base32, поскольку эти системы могут быть base32 согласно RFC 4648 §6 или §7 (возможно, игнорируя отказ RFC от более простого названия для последнего), или они могут быть еще одним вариантом кодировки, см. далее ниже.
Наиболее широко используемый [ требуется ссылка ] алфавит base32 определен в RFC 4648 §6 и более раннем RFC 3548 (2003). Схема была первоначально разработана в 2000 году Джоном Майерсом для SASL / GSSAPI . [2] Он использует алфавит A – Z , за которым следуют 2 – 7. Цифры 0 , 1 и 8 пропущены из-за их сходства с буквами O , I и B (таким образом, «2» имеет десятичное значение 26 ).
В некоторых случаях заполнение не требуется или не используется (заполнение может быть выведено из длины строки по модулю 8). RFC 4648 утверждает, что заполнение должно использоваться, если спецификация стандарта (ссылающаяся на RFC) явно не указывает иное. Исключение заполнения полезно при использовании данных в кодировке Base32 в токенах URL или именах файлов, где символ заполнения может представлять проблему.
Это пример представления Base32 с использованием ранее описанного набора из 32 символов ( IPFS CIDv1 в кодировке Base32 в верхнем регистре):BAFYBEICZSSCDSBS7FFQZ55ASQDF3SMV6KLCW3GOFSZVWLYARCI47BGF354
«Расширенная шестнадцатеричная» система счисления с основанием 32 или base32hex [3], еще одна схема для основания 32 согласно RFC 4648 §7, расширяет шестнадцатеричную систему счисления более естественным образом: ее нижняя половина идентична шестнадцатеричной системе счисления, а за ее пределами base32hex просто продолжает алфавит до буквы V.
Эта схема была впервые предложена Кристианом Ланктотом, программистом, работающим в Sage software , в письме в журнал Dr. Dobb's в марте 1999 года [4] как часть предлагаемого решения для ошибки Y2K . Ланктот назвал ее «Double Hex». Тот же алфавит был описан в 2000 году в RFC 2938 под названием «Base-32». RFC 4648, признавая существующее использование этой версии в NSEC3 , называет ее base32hex и не рекомендует называть ее только «base32».
Поскольку эта нотация использует цифры 0-9, за которыми следуют последовательные буквы алфавита, она соответствует цифрам, используемым функцией JavaScript [ 5] и конструктором Python [6], когда указано основание больше 10 (например, 16 или 32). Она также сохраняет свойство шестнадцатеричной системы счисления сохранять побитовый порядок сортировки представленных данных, в отличие от §6 base32 или base64 RFC 4648. [3]parseInt()
int()
В отличие от многих других систем счисления с основанием 32, цифры base32hex после 9 являются смежными. Однако ее набор цифр включает символы, которые могут визуально конфликтовать. С правильным шрифтом можно визуально различить 0, O и 1, I, но другие шрифты могут быть неподходящими, так как эти буквы могут быть трудны для различения человеком, особенно когда контекст, который обычно предоставляет английский язык, отсутствует в системе счисления, которая выражает только числа. [b] Выбор шрифта не контролируется нотацией или кодировкой, однако base32hex не пытается компенсировать недостатки затронутых шрифтов. [c]
При изменении алфавита Base32 все альтернативные стандарты имеют схожие комбинации буквенно-цифровых символов.
z-base-32 [7] — это кодировка Base32, разработанная Zooko Wilcox-O'Hearn, чтобы быть более простой для использования человеком и более компактной. Она включает 1 , 8 и 9 , но исключает l , v , и 2. Она также переставляет алфавит так, что более простые символы встречаются чаще. [ требуется пояснение ] Она компактно кодирует битовые строки, длина которых в битах не кратна 8 [ требуется пояснение ] и опускает конечные символы-заполнители. z-base-32 использовалась в проекте с открытым исходным кодом Mnet, а в настоящее время используется в протоколе ZRTP Фила Циммермана и в проекте с открытым исходным кодом Tahoe-LAFS .
Другой альтернативный дизайн для Base32 создан Дугласом Крокфордом , который предлагает использовать дополнительные символы для контрольной суммы mod-37. [8] Он исключает буквы I, L и O, чтобы избежать путаницы с цифрами. Он также исключает букву U, чтобы уменьшить вероятность случайной непристойности.
Библиотеки для кодирования двоичных данных в Base32 Крокфорда доступны на различных языках.
Более ранняя форма записи с основанием 32 использовалась программистами, работавшими над Electrologica X1, для представления адресов машин. «Цифры» были представлены как десятичные числа от 0 до 31. Например, 12-16 будет представлять адрес машины 400 (= 12 × 32 + 16).
См. алгоритм Geohash , используемый для представления значений широты и долготы в одном (чередующемся битами) положительном целом числе. [9] Представление Geohash в формате base32 использует все десятичные цифры (0–9) и почти все строчные буквы алфавита, за исключением букв «a», «i», «l», «o», как показано в следующей таблице символов:
До того, как NVRAM стал универсальным, несколько видеоигр для платформ Nintendo использовали 31-ю систему счисления для паролей . Эти системы опускают гласные (кроме Y), чтобы предотвратить случайное введение ненормативной лексики в игру . Таким образом, символы, как правило, представляют собой некоторые незначительные вариации следующего набора: 0–9, B, C, D, F, G, H, J, K, L, M, N, P, Q, R, S, T, V, W, X, Y, Z и некоторые знаки препинания. Известно, что такие игры используют такую систему: Mario Is Missing!, Mario 's Time Machine , Tetris Blast и The Lord of the Rings (Super NES) .
Безопасный для слов алфавит Base32 является расширением алфавита Open Location Code Base20 . Этот алфавит использует 8 цифровых цифр и 12 чувствительных к регистру буквенных цифр, выбранных для предотвращения случайного формирования слов. Обработка алфавита как чувствительного к регистру дает набор из 32 (8+12+12) цифр.
Base32 имеет ряд преимуществ перед Base64 :
Base32 имеет преимущества перед шестнадцатеричной системой счисления / Base16 :
По сравнению с 8-битными кодировками 5-битные системы также могут иметь преимущества при использовании для передачи символов:
Представление Base32 занимает примерно на 20% больше места, чем Base64 . Кроме того, поскольку оно кодирует пять 8-битных байтов (40 бит) в восемь 5-битных символов base32, а не три 8-битных байта (24 бита) в четыре 6-битных символа base64, заполнение до границы 8 символов создает большую нагрузку для коротких сообщений (что может быть причиной отказа от заполнения, которое является опцией в RFC 4648).
Даже если Base32 занимает примерно на 20% меньше места, чем шестнадцатеричная система , Base32 используется гораздо реже. Шестнадцатеричную систему можно легко сопоставить с байтами, поскольку две шестнадцатеричные цифры — это байт. Base32 не сопоставляется с отдельными байтами. Однако две цифры Base32 соответствуют десяти битам, которые могут кодировать (32 × 32 =) 1024 значения, с очевидными применениями для порядков величин многобайтовых единиц в терминах степеней 1024.
Шестнадцатеричную систему легче выучить и запомнить, поскольку для этого требуется запомнить только числовые значения шести дополнительных символов (A–F), и даже если они не вспоминаются сразу, проще пересчитать всего несколько значений.
Программы Base32 подходят для кодирования произвольных байтовых данных с использованием ограниченного набора символов, которые могут быть удобно использованы людьми и обработаны компьютерами.
Реализации Base32 используют набор символов, состоящий как минимум из 32 различных символов (иногда 33-го для заполнения), а также алгоритм кодирования произвольных последовательностей 8-битных байтов в алфавит Base32. Поскольку для представления каждого 8-битного входного байта требуется более одного 5-битного символа Base32, если входные данные не кратны 5 байтам (40 бит), то они не умещаются точно в 5-битные символы Base32. В этом случае некоторые спецификации требуют добавления символов заполнения, в то время как некоторые требуют дополнительных нулевых битов для создания кратности 5 бит. Тесно связанная система Base64, напротив, использует набор из 64 символов (или 65 символов при использовании заполнения).
Доступны реализации Base32 на языках C/C++, [10] [11] Perl, [12] Java, [13] JavaScript [14] Python, [15] Go [16] и Ruby [17] . [18]