Почему base128 не используется? [закрыто]

90

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

Гмадар
источник
60
Почему даже не 256?
Гамбо
22
Думаю, дело в том, чтобы печатные символы (хотя их тоже больше 64 ...)
Феликс Клинг
29
Я думаю, что база 128 досталась нам некоторое время назад. Команда, назначенная для охраны базы 64, все еще держится.
Ритч Мелтон
5
почему этот вопрос специфичен для javascript? это верно и для большинства других языков, которые используются в сети, не так ли?
Бенедикт Вальдфогель
5
@KenRockot: Я вижу, вы понимаете, что некоторые из ваших 15-битных символов будут закодированы в 3 байта. Ваша кодировка base-2048 означает упаковку 11 бит в 2 байта, что составляет 5,5 бит на байт - половину бит меньше, чем base-64.
maaartinus

Ответы:

105

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

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

Pepoluan
источник
7
Base91 кажется хорошим вариантом с открытым исходным кодом: base91.sourceforge.net
Хорхе
2
Стоит учитывать, что степень двойки легче соответствует байтовым данным, а кодирование проще. Тогда есть портативность; у каждого языка есть кодирование base64 и / или декодирование base64.
Lodewijk
5
Re Base85 и Adobe : ответ можно было бы сделать более полезным, если бы в нем были указаны номера патентов и год предоставления. Если патенты - проблема, то всегда btoa, которая датируется 1990 годом, не обременена патентами, и те, безусловно, в любом случае истекут.
АРУ
65

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

Driis
источник
8
Base94 существует здесь в GitHub, он использует все 94 печатных символов ASCII: gist.github.com/iso2022jp/4054241
intrepidis
15

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

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

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

Бенедикт Вальдфогель
источник
Я был бы заинтересован в java-версии
Майкл Дирдефф
2
Отправил это на: github.com/bwaldvogel/base91
Бенедикт Вальдфогель
12

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

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

Это причина!

user3119289
источник
7
Управляющие символы имеют значение, потому что почти все уже предполагали, что ваша точка зрения должна быть как можно более нейтральной к кодовой странице / кодировке. Это обязательно ограничивает вас только (7-битным) ASCII, который является подмножеством большинства соответствующих кодировок. Также не весь Интернет является 8-битным чистым, и большая часть его фактически является ASCII. Тем не менее, ваша точка зрения заслуживает внимания.
Тим Сегин
7
Просто добавлю: ASCII определяет только 128 символов. Символы от 128 до 255 не определены в ASCII. Поскольку вопрос явно ссылается на ASCII, а не на «любую 8-битную кодировку», все ответы ограничиваются 128 символами набора ASCII.
pepoluan
Использование наиболее распространенной кодировки UTF-8 в качестве примера: байты от 128 до 196 немедленно приведут к ошибкам декодирования UTF8; байты с 196 по 256 означают, что следующий байт также имеет тот же символ, но тогда, если следующий байт меньше 128, это снова приведет к ошибкам декодирования UTF8. Однако почти во всех языках, чувствительных к кодировке символов, библиотека base64 будет принимать строки base64 как строки, безопасные для UTF8. То же самое нельзя сделать с base128, поскольку он не может быть закодирован как безопасная для UTF8 строка.
SOFe
10

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

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

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

  • Фиксированный размер кодировки. Вы знаете, что mбайты всегда можно кодировать в nбайты.

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

Base128 не обладает всеми этими преимуществами.

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

Однако это еще не все отрицательно.

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

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

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

Джон Ла Рой
источник
Также помните, что почтовые / новостные системы и им подобные (а также XML) не всегда подходят для первых 32 кодовых точек (например, рассмотрите CR LF против LF), но в остальном ваш ответ выглядит очень хорошо.
SamB
«этот base64 использует 65 символов». => опечатка или я что-то упустил?
Kikiwa
@Kikiwa, посмотрите этот образец java в википедии . Проверьте длину CODESпеременной.
John La Rooy
О да, символ заполнения '=' только в конце полезной нагрузки кодирования, вы правы, спасибо.
Kikiwa
4

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

Esaj
источник
3

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

Рассел Тройвест
источник
2

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

GoogleCode PHP-класс Base128

Seizu
источник
1
Я бы хотел, чтобы вместо этого использовался utf-8 ...
Янус Троелсен
1
Базовая кодировка не имеет ничего общего с базовыми данными. Вы можете использовать любую кодировку текста, которую хотите, чтобы закодировать свой текст / данные. Он имеет в виду, что индексная таблица Base ## использует кодировку ISO 8859-1 ASCII в качестве перевода.
Чад
1
Это действительно имеет какое-то отношение к базовым данным, как только вы пытаетесь встроить двоичные данные с кодировкой в ​​текст. Если этот текст закодирован в другой кодировке, у вас возникнут проблемы.
Stijn de Witt
Не существует такой вещи, как набор символов «ISO 8859-1 ASCII». Программа кодирует данные с использованием 128 различных печатаемых символов ISO 8859-1. Он не использует ASCII ни в каком виде, ни в какой форме.
Ниссе Энгстрём