Почему base128 не используется?

Почему для передачи двоичных данных в сети используется только base64 вместо base128? Набор символов ASCII имеет 128 символов, которые теоретически могут представлять собой основание 128, но в большинстве случаев используется только base64, но не base128.

Ответ 1

Проблема состоит в том, что по меньшей мере 32 символа набора символов ASCII являются "управляющими символами", которые могут быть интерпретированы принимающим терминалом. Например, существует символ BEL (звонок), который делает приемный терминальный сигнал. Здесь присутствуют символы SOT (начало передачи) и EOT (конец передачи), которые точно соответствуют их именам. И не забывайте символы CR и LF, которые могут иметь особые значения в том, как структуры данных сериализуются/сплющиваются в поток.

Adobe создала кодировку Base85, чтобы использовать больше символов в наборе символов ASCII, но AFAIK защищена патентами.

Ответ 2

Потому что некоторые из этих 128 символов непечатаемы (в основном те, которые ниже кода 0x20). Поэтому они не могут быть надежно переданы в виде строки по проводу. И, если вы переходите выше codepoint 128, вы можете иметь проблемы с кодировкой из-за разных кодировок, используемых в разных системах.

Ответ 3

Как уже указывалось в других ответах, ключевым моментом является сокращение набора символов до для печати. Более эффективная схема кодирования basE91, поскольку она использует больший набор символов и по-прежнему избегает символов управления/пробелов в диапазоне низких ASCII. Веб-страница содержит хорошее сравнение эффективности binary vs. base64 и basE91.

Я однажды очистил реализацию Java. Если люди заинтересованы, я могу нажать на GitHub.

Обновить: теперь на GitHub.

Ответ 4

То, что первые 32 символа являются управляющим символом, не имеет абсолютно никакой релевантности, потому что вам не нужно использовать их для получения 128 символов. У нас есть 256 символов на выбор, и только первые 32 являются управляющими. Это оставляет 192 символа, и поэтому 128 вполне возможно без использования управляющих символов.

Вот причина: это должно быть то, что будет выглядеть одинаково, и что вы можете копировать и вставлять, независимо от того, где. Следовательно, это должны быть символы, которые будут отображаться одинаково на любом форуме, чате, электронной почте и т.д. Это означает, что мы не можем использовать символы, которые обычно используются для форматирования или игнорирования клиентов форума/чата/электронной почты. Он также должен быть символами одинаковыми независимо от шрифтов, языков и региональных настроек.

Вот почему!

Ответ 5

Base64 распространен, потому что он решает множество проблем (работает почти везде, о чем вы можете думать)

  • Вам не нужно беспокоиться, является ли транспорт 8-битным чистым или нет.

  • Все символы в кодировке могут быть распечатаны. Вы можете их увидеть. Вы можете копировать и вставлять их. Вы можете использовать их в URL-адресах (конкретные варианты). и др.

  • Исправлен размер кодировки. Вы знаете, что байты m всегда могут кодироваться в n bytes.

  • Все слышали об этом - он широко поддерживается, множество библиотек, с которыми легко взаимодействовать.

Base128 не имеет всех этих преимуществ.

Похоже, что это 8-битная чистка, но помните, что base64 использует 65 символов. Без внеполосного символа вы не можете иметь преимущества фиксированного размера кодировки. Если вы используете внеполосный символ, вы больше не можете очищать 8 бит.

Это не все отрицательно, хотя.

  • base128 проще кодировать/декодировать, чем base64 - вы просто используете сдвиги и маски. Может быть важным для встроенных реализаций

  • base128 делает несколько более эффективное использование транспорта, чем base64, используя больше доступных бит.

Люди действительно используют base128 - я использую его для чего-то сейчас. Это просто не так часто.

Ответ 6

Не уверен, но я думаю, что более низкие значения (представляющие управляющие коды или что-то еще) не надежно передаются в виде текста/символов внутри HTTP-запросов/ответов, а значения выше 127 могут быть языковыми/кодовыми/независимо-специфическими, поэтому не существует 128 различных символов, которые можно ожидать для всех браузеров/платформ.

Ответ 7

esaji прав. Base64 используется для кодирования двоичных данных для передачи с использованием протокола, который ожидает только текст. Это прямо в записи Wiki.

Ответ 8

Ознакомьтесь с базовым классом base128 PHP. Кодирование и декодирование с помощью кодировки ISO 8859-1.

GoogleCode PHP-Class Base128