stringtranslate.com

Base32

Base32 — это метод кодирования, основанный на системе счисления base -32 . Он использует алфавит из 32 цифр , каждая из которых представляет собой различную комбинацию из 5 бит (2 5 ). Поскольку base32 не очень широко принята, вопрос об обозначениях — какие символы использовать для представления 32 цифр — не так урегулирован, как в случае более известных систем счисления (например, шестнадцатеричной ), хотя существуют RFC и неофициальные и фактические стандарты. Одним из способов представления чисел Base32 в понятной для человека форме является использование цифр 0–9, за которыми следуют двадцать две заглавные буквы A–V. Однако в разных контекстах используется множество других вариаций. Исторически код Бодо можно считать модифицированным ( с сохранением состояния ) кодом base32.

В данной статье рассматривается использование Base32 для представления байтовых строк, а не беззнаковых целых чисел, аналогично тому, как работает Base64 .

Кодировки RFC 4648

Предложенный в октябре 2006 года стандарт Интернета [1] RFC  4648 документирует кодировки base16 , base32 и base64. Он включает две схемы для base32, но рекомендует одну из них вместо другой. Он также рекомендует, чтобы независимо от прецедента только алфавит, который он определяет в своем разделе 6, фактически назывался base32, а другой похожий алфавит в его разделе 7 вместо этого назывался base32hex. [a] Согласие с этими рекомендациями не является всеобщим. Необходимо соблюдать осторожность при использовании систем, которые называются base32, поскольку эти системы могут быть base32 согласно RFC 4648 §6 или §7 (возможно, игнорируя отказ RFC от более простого названия для последнего), или они могут быть еще одним вариантом кодировки, см. далее ниже.

Кодировка Base 32 согласно §6

Наиболее широко используемый [ требуется ссылка ] алфавит 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

Кодировка Base 32 с расширенным шестнадцатеричным алфавитом согласно §7

«Расширенная шестнадцатеричная» система счисления с основанием 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

z-base-32 [7] — это кодировка Base32, разработанная Zooko Wilcox-O'Hearn, чтобы быть более простой для использования человеком и более компактной. Она включает 1 , 8 и 9 , но исключает l , v , и 2. Она также переставляет алфавит так, что более простые символы встречаются чаще. [ требуется пояснение ] Она компактно кодирует битовые строки, длина которых в битах не кратна 8 [ требуется пояснение ] и опускает конечные символы-заполнители. z-base-32 использовалась в проекте с открытым исходным кодом Mnet, а в настоящее время используется в протоколе ZRTP Фила Циммермана и в проекте с открытым исходным кодом Tahoe-LAFS .

База Крокфорда32

Другой альтернативный дизайн для 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 :

  1. Результирующий набор символов представляет собой один регистр, что часто может быть полезно при использовании файловой системы , нечувствительной к регистру , имен DNS , устной речи или человеческой памяти.
  2. Результат можно использовать в качестве имени файла, поскольку он не может содержать символ «/», который является разделителем пути в Unix .
  3. Алфавит можно выбрать так, чтобы избежать похожих пар разных символов, поэтому строки можно точно транскрибировать вручную. (Например, набор символов RFC  4648 §6 не содержит цифр для единицы, восьмерки и нуля, поскольку их можно спутать с буквами «I», «B» и «O»).
  4. Результат без отступов может быть включен в URL-адрес без кодирования каких-либо символов.

Base32 имеет преимущества перед шестнадцатеричной системой счисления / Base16 :

  1. Представление Base32 занимает на 20% меньше места. (1000 бит занимают 200 символов по сравнению с 250 для Base16.)

По сравнению с 8-битными кодировками 5-битные системы также могут иметь преимущества при использовании для передачи символов:

  1. Схема Base32 RFC 4648 §6 и аналогичные схемы, в которых используется полный алфавит, позволяют кодировать на два символа больше на каждое 32-битное целое число (всего 6 вместо 4, с 2 запасными битами), что позволяет экономить полосу пропускания в ограниченных областях, таких как радиосети.

Недостатки

Представление 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]

Смотрите также

Примечания

  1. ^ Для контекста, предлагаемый стандарт также документирует две кодировки base64, и здесь также выражает предпочтение одной из них, хотя и по другим причинам. Документирована только одна кодировка base16 – давно общепринятая даже до публикации RFC 4648 или его предшественника RFC 3548.
  2. ^ Сходство раньше было особенностью, а не ошибкой, поскольку позволяло ранним пишущим машинкам опускать дополнительные клавиши для цифр 0 и 1, тем самым уменьшая механическую сложность. Когда появились компьютеры, считалось желательным, чтобы ранние компьютерные принтеры могли печатать тот же шрифт, что и качественные пишущие машинки, поэтому шрифты, похожие на пишущие машинки, сохраняли сходство этих букв. Много лет спустя больше нет необходимости использовать шрифты, которые не различают четко некоторые буквы, но традиция сохраняется. Не только шрифты в стиле пишущих машинок имеют схожие проблемы — они есть у многих влиятельных шрифтов, например, Helvetica .
  3. ^ Дизайн многих вариантов base32 обусловлен представлением о том, что рискованно предполагать, что будет использоваться различимый шрифт. С другой стороны, логика схемы, не пытающейся компенсировать странности за пределами ее компетенции, может быть более простой.

Ссылки

  1. ^ «Официальные стандарты интернет-протоколов» Редактор RFC.
  2. Майерс, Дж. (23 мая 2000 г.). Механизмы SASL GSSAPI. Идентификатор черновика-ietf-cat-sasl-gssapi-01 . Проверено 24 июня 2023 г.
  3. ^ ab Josefsson, Simon (2006). "7. Кодировка Base 32 с расширенным шестнадцатеричным алфавитом". RFC 4648: Кодировки данных Base16, Base32 и Base64 . IETF. doi : 10.17487/RFC4648 .
  4. ^ Ланктот, Кристиан (1999-03-01). "Лучшее свидание? (второе письмо под этим заголовком) - Письма". Доктор Доббс .
  5. ^ «parseInt() — JavaScript». Веб-документы MDN . Мозилла. 29 декабря 2023 г.
  6. ^ "Built-in Functions". Документация Python . Python Software Foundation. Архивировано из оригинала 2018-10-26 . Получено 2017-08-09 .
  7. ^ O'Whielacronx, Zooko (2009). «Человекоориентированное кодирование base-32».
  8. ^ Дуглас Крокфорд. "База 32". Архивировано из оригинала 2002-12-23.
  9. ^ "Советы и рекомендации - geohash.org". geohash.org . Получено 2020-04-03 .
  10. ^ "CyoEncode". SourceForge . 24 июня 2023 г.
  11. ^ "Gnulib - Библиотека переносимости GNU - Проект GNU - Фонд свободного программного обеспечения". www.gnu.org .
  12. ^ "MIME-Base32 - кодировщик и декодер Base32". MetaCPAN . Получено 29-07-2018 .
  13. ^ "Base32 (API Apache Commons Codec 1.15)". commons.apache.org .
  14. ^ "base32". npm . 27 сентября 2022 г.
  15. ^ "base64 — Кодировки данных Base16, Base32, Base64, Base85". Документация Python .
  16. ^ "Пакет Base32 - кодирование/Base32 - PKG.go.dev".
  17. ^ "base32 | RubyGems.org | ваш хост gem-файлов сообщества". rubygems.org .
  18. ^ "Конвертер строк в шестнадцатеричные числа". Beautify Code .