Почему мы используем Base64?

Wikipedia говорит

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

Но разве это не то, что данные всегда хранятся/передаются в двоичном виде, потому что память, которую наши машины имеют двоично, и это просто зависит от того, как вы ее интерпретируете? Итак, кодируете ли бит шаблон 010011010110000101101110 как Man в ASCII или как TWFu в Base64, вы в конечном итоге собираетесь хранить один и тот же шаблон бит.

Если конечная кодировка относится к нулям и единицам, и каждая машина и средства массовой информации могут справиться с ними, как имеет значение, если данные представлены как ASCII или Base64?

Что означает "средства массовой информации, предназначенные для обработки текстовых данных"? Они могут иметь дело с двоичным = > они могут иметь дело с чем-либо.


Спасибо всем, думаю, теперь я понимаю.

Когда мы отправляем данные, мы не можем быть уверены, что данные будут интерпретироваться в том же формате, в каком мы это предполагали. Таким образом, мы отправляем данные, закодированные в некотором формате (например, Base64), которые понимают обе стороны. Таким образом, даже если отправитель и получатель интерпретируют одни и те же вещи по-разному, но поскольку они согласны с кодированным форматом, данные не будут интерпретироваться неправильно.

Из Пример Mark Byers

Если я хочу отправить

Hello
world!

Один из способов - отправить его в ASCII, например

72 101 108 108 111 10 119 111 114 108 100 33

Но байт 10 не может быть правильно интерпретирован как новая строка на другом конце. Итак, мы используем подмножество ASCII для его кодирования следующим образом:

83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61

который за счет большего количества передаваемых данных за один и тот же объем информации гарантирует, что получатель может декодировать данные по назначению, даже если приемник имеет разные интерпретации для остальной части набора символов.

Ответ 1

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

  • Когда вы кодируете текст в ASCII, вы начинаете с текстовой строки и преобразуете ее в последовательность байтов.
  • Когда вы кодируете данные в Base64, вы начинаете с последовательности байтов и преобразуете их в текстовую строку.

Чтобы понять, почему Base64 был необходим, в первую очередь нам нужна небольшая история вычислений.


Компьютеры обмениваются данными в двоичном формате - 0 с и 1 с - но люди обычно хотят связываться с более богатыми формами данных, такими как текст или изображения. Чтобы перенести эти данные между компьютерами, он сначала должен быть закодирован в 0 и 1, отправлен, а затем снова декодирован. Чтобы взять текст в качестве примера - существует много разных способов выполнения этой кодировки. Было бы намного проще, если бы мы все согласились на одну кодировку, но, к сожалению, это не так.

Первоначально было создано много разных кодировок (например, код Baudot), в котором использовалось другое количество бит на символ, пока, наконец, ASCII не стал стандартом с 7 бит на символ. Однако большинство компьютеров хранят двоичные данные в байтах, состоящих из 8 бит, поэтому ASCII не подходит для передачи этого типа данных. Некоторые системы даже уничтожали бы самый значительный бит. Кроме того, разница в кодировании конца строки в системах означает, что также изменялись символы ASCII 10 и 13.

Чтобы решить эти проблемы, была введена кодировка Base64. Это позволяет вам закодировать произвольные байты в байтах, которые, как известно, безопасны для отправки без повреждения (буквенно-цифровые символы ASCII и несколько символов). Недостатком является то, что кодирование сообщения с использованием Base64 увеличивает его длину - каждые 3 байта данных кодируются в 4 символа ASCII.

Чтобы надежно отправить текст, вы можете сначала кодировать в байты с помощью текстового кодирования по вашему выбору (например, UTF-8), а затем впоследствии. Base64 кодирует результирующие двоичные данные в текстовую строку, безопасную для отправки в виде ASCII. Получателю придется отменить этот процесс, чтобы восстановить исходное сообщение. Это, конечно, требует, чтобы получатель знал, какие кодировки были использованы, и эту информацию часто нужно отправлять отдельно.

Исторически он использовался для кодирования двоичных данных в почтовых сообщениях, где сервер электронной почты мог изменять окончание строки. Более современным примером является использование кодировки Base64 для вставлять данные изображения непосредственно в исходный код HTML. Здесь необходимо кодировать данные, чтобы избежать символов типа '<' и ' > ' интерпретируются как теги.


Вот пример:

Я хочу отправить текстовое сообщение с двумя строками

Hello
world!

Если я отправлю его как ASCII (или UTF-8), он будет выглядеть следующим образом:

72 101 108 108 111 10 119 111 114 108 100 33

Байт 10 поврежден в некоторых системах, поэтому мы можем кодировать эти байты в виде строки Base64:

SGVsbG8sCndvcmxkIQ==

Что при кодировании с использованием ASCII выглядит следующим образом:

83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61

Все байты здесь являются безопасными байтами, поэтому очень мало шансов, что любая система испортит это сообщение. Я могу отправить это вместо моего исходного сообщения и позволить получателю отменить процесс для восстановления исходного сообщения.

Ответ 2

Кодирование двоичных данных в XML

Предположим, вы хотите встроить пару изображений в документ XML. Изображения являются двоичными данными, а документ XML - текстовым. Но XML не может обрабатывать встроенные двоичные данные. Итак, как вы это делаете?

Одним из вариантов является кодирование изображений в base64, превращение двоичных данных в текст, который может обрабатывать XML.

Вместо:

<images>
  <image name="Sally">{binary gibberish that breaks XML parsers}</image>
  <image name="Bobby">{binary gibberish that breaks XML parsers}</image>
</images>

ты сделаешь:

<images>
  <image name="Sally" encoding="base64">j23894uaiAJSD3234kljasjkSD...</image>
  <image name="Bobby" encoding="base64">Ja3k23JKasil3452AsdfjlksKsasKD...</image>
</images>

А синтаксический анализатор XML сможет правильно анализировать документ XML и извлекать данные изображения.

Ответ 3

Почему бы не посмотреть RFC, который в настоящее время определяет Base64?

Базовая кодировка данных используется в много ситуаций для хранения или передачи
данных в средах, которые, возможно, для наследственные причины, ограничены US-ASCII [1] data.Base кодирование может также можно использовать в новых приложениях которые не имеют устаревших ограничений, просто потому, что это позволяет манипулировать объектами с текстом редактора.

В прошлом разные приложения имеют разные требования и таким образом, иногда реализуется база кодировки в несколько разных пути. Сегодня спецификации протокола иногда используют базовые кодировки в общего и "base64", в частности, без точного описания или Справка. Многоцелевая интернет-почта Часто используются расширения (MIME) [4] как ссылка для base64 без учитывая последствия для обертка строк или не-алфавит персонажи. Цель этого спецификация заключается в установлении общих алфавит и кодирование соображения. Это, мы надеемся, уменьшить двусмысленность в других документов, что совместимость.

Base64 был первоначально разработан как способ привязки двоичных данных к электронным письмам как часть многоцелевых расширений электронной почты Интернета.

Ответ 4

Медиа, предназначенное для текстовых данных, конечно, также в конечном итоге является двоичным, но текстовые носители часто используют определенные двоичные значения для управляющих символов. Кроме того, текстовые носители могут отклонять определенные двоичные значения как нетекстовые.

Кодирование Base64 кодирует двоичные данные как значения, которые могут быть интерпретированы только как текст в текстовом носителе и не содержит никаких специальных символов и/или управляющих символов, чтобы данные сохранялись и на текстовых носителях.

Ответ 5

Более того, среда проверяет строковое кодирование, поэтому мы хотим убедиться, что данные приемлемы приложением обработки (и не содержат двоичную последовательность, представляющую EOL, например)

Представьте, что вы хотите отправить двоичные данные в электронном письме с кодировкой UTF-8. Возможно, сообщение электронной почты может отображаться некорректно, если поток из них и нули создает последовательность, которая недействительна Unicode в UTF-8.

То же самое происходит в URL-адресах, когда мы хотим кодировать символы, не допустимые для URL-адреса в самом URL-адресе:

http://www.foo.com/hello мой друг → http://www.foo.com/hello%20my%20friend

Это потому, что мы хотим отправить пространство над системой, которая будет считать, что пространство вонючее.

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

В вашем примере man может быть действительным ASCII в первой форме; но часто вы можете передавать значения, которые являются случайными двоичными (т.е. отправка изображения по электронной почте):

MIME-Version: 1.0
Content-Description: "Base64 encode of a.gif"
Content-Type: image/gif; name= "a.gif"
Content-Transfer-Encoding: Base64
Content-Disposition: вложение; filename = "a.gif"

Здесь мы видим, что GIF-образ закодирован в base64 как часть электронной почты. Клиент электронной почты считывает заголовки и декодирует их. Из-за кодирования мы можем быть уверены, что GIF не содержит ничего, что может быть интерпретировано как протокол, и мы избегаем вставки данных, которые могут найти существенные SMTP или POP.

Ответ 6

Одним из примеров того, когда мне было удобно, было при попытке встраивать двоичные данные в XML. Некоторые из двоичных данных были неверно истолкованы парсером SAX, потому что эти данные могут быть буквально любыми, включая специальные символы XML. Base64, кодирующий данные на передающем конце и декодируя их на принимающей стороне, исправил эту проблему.

Ответ 7

Base64 вместо экранирования специальных символов

Я приведу совсем другой, но реальный пример: я пишу код JavaScript для запуска в браузере. HTML-теги имеют значения идентификатора, но существуют ограничения на то, какие символы допустимы в идентификаторе.

Но я хочу, чтобы мой идентификатор без потерь ссылался на файлы в моей файловой системе. В действительности файлы могут содержать самые разные странные и замечательные символы: восклицательные знаки, акцентированные символы, тильду и даже смайлики! Я не могу сделать это:

<div id="/path/to/[email protected]().jpg">
    <img src="http://myserver.com/path/to/[email protected]().jpg">
    Here a pic I took in Moscow.
</div>

Предположим, я хочу запустить такой код:

# ERROR
document.getElementById("/path/to/[email protected]().jpg");

Я думаю, что этот код не выполнится при выполнении.

С Base64 я могу сослаться на что-то сложное, не беспокоясь о том, какой язык допускает какие специальные символы и какие нужно экранировать:

document.getElementById("18GerPD8fY4iTbNpC9hHNXNHyrDMampPLA");

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

Я хотел бы знать о Base64 лет назад. Я бы не рвал на себе волосы с encodeURIComponent ' encodeURIComponent and str.replace('\n,\\n)

SSH перевод текста:

Если вы пытаетесь передать сложные данные через ssh (например, файл точек, чтобы вы могли получить персонализацию своей оболочки), удачи вам сделать это без Base 64. Вот как вы это сделаете с Base 64 (я знаю, что вы можете использовать SCP, но для этого потребовалось бы несколько команд - что усложняет привязку клавиш для sshing на сервер):

Ответ 8

Большинство компьютеров хранят данные в 8-битном двоичном формате, но это не является обязательным требованием. Некоторые машины и средства передачи данных могут обрабатывать только 7 бит (или, возможно, даже меньше) за раз. Такой носитель будет интерпретировать поток в кратном виде из 7 бит, поэтому, если бы вы отправляли 8-битные данные, вы не получите то, что ожидаете с другой стороны. Base-64 - это всего лишь один из способов решения этой проблемы: вы кодируете вход в 6-битный формат, отправляете его по своему медиа и декодируете его обратно в 8-битный формат на принимающей стороне.

Ответ 9

Что означает "средства массовой информации, предназначенные для работы с текстовыми данными"?

Эти протоколы были разработаны для обработки текста (часто только английского текста) вместо двоичных данных (например, изображений .png и .jpg).

Они могут иметь дело с бинарным => они могут иметь дело с чем угодно.

Но обратное неверно. Протокол, разработанный для представления текста, может неправильно обрабатывать двоичные данные, которые содержат:

  • Байты 0x0A и 0x0D, используемые для окончаний строк, различаются по платформам.
  • Другие управляющие символы, такие как 0x00 (NULL = терминатор строки C), 0x03 (END OF TEXT), 0x04 (END OF TRANSMISSION) или 0x1A (конец файла DOS), которые могут преждевременно сигнализировать об окончании данных.
  • Байты выше 0x7F (если протокол, который был разработан для ASCII).
  • Последовательности байтов, которые являются недействительными UTF-8.

Таким образом, вы не можете просто отправлять двоичные данные по текстовому протоколу. Вы ограничены байтами, которые представляют неконтролирующие неконтролирующие символы ASCII, которых насчитывается 94. Причина, по которой Base 64 была выбрана, заключалась в том, что она быстрее работает со степенями двойки, а 64 - самая большая из них, которая работает,

Хотя один вопрос. Как эти системы все еще не согласны с общей техникой кодирования, такой как UTF-8?

В Интернете, по крайней мере, они в основном есть. Большинство сайтов используют UTF-8.

Проблема на Западе состоит в том, что существует много старых программ, которые считают, что 1 байт = 1 символ и не могут работать с UTF-8.

Проблема на Востоке заключается в их привязанности к кодировкам, таким как GB2312 и Shift_JIS.

И тот факт, что Microsoft, похоже, все еще не справился, выбрав неправильную кодировку UTF. Если вы хотите использовать Windows API или библиотеку времени выполнения Microsoft C, вы ограничены кодировкой UTF-16 или локалью ANSI. Это делает болезненным использование UTF-8, потому что вам приходится все время конвертировать.

Ответ 10

В дополнение к другим (несколько длинным) ответам: даже игнорируя старые системы, которые поддерживают только 7-разрядный ASCII, основными проблемами с поставкой двоичных данных в текстовом режиме являются:

  • Новые строки обычно преобразуются в текстовом режиме.
  • Нужно быть осторожным, чтобы не обрабатывать NUL-байты как конец текстовой строки, что слишком легко сделать в любой программе с C-линией.

Ответ 11

Почему/Как мы используем кодировку Base64?

Base64 - это одна из схем кодирования двоичного текста с эффективностью 75%. Он используется для того, чтобы типичные двоичные данные (такие как изображения) могли безопасно отправляться по устаревшим "не 8-битным чистым" каналам. В более ранних сетях электронной почты (до начала 1990-х годов) большинство сообщений электронной почты представляли собой простой текст в 7-битном наборе символов US-ASCII. Так много ранних стандартов протокола связи были разработаны для работы над "7-битными" ссылками связи "не 8-битными чистыми". Эффективность схемы - это соотношение между количеством битов на входе и количеством битов на кодированном выходе. Шестнадцатеричное (Base16) также является одной из схем двоичного кодирования с эффективностью 50%.

Шаги кодирования Base64 (упрощенно):

  1. Двоичные данные расположены в виде непрерывных кусков по 24 бита (3 байта) каждый.
  2. Каждый 24-битный блок сгруппирован в четыре части по 6 бит.
  3. Каждая 6-битная группа преобразуется в соответствующие им значения символов Base64, то есть кодировка Base64 преобразует три октета в четыре кодированных символа. Отношение выходных байтов к входным байтам составляет 4: 3 (33% накладных расходов).
  4. Интересно, что одни и те же символы будут кодироваться по-разному в зависимости от их положения в трехоктетной группе, которая кодируется для получения четырех символов.
  5. Получатель должен будет отменить этот процесс, чтобы восстановить исходное сообщение.

Ответ 12

Что означает "средства массовой информации, предназначенные для обработки текстовых данных"?

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