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

Википедия говорит

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

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

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

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


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

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

Пример от Марка Байерса

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

 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 

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

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

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

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


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

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

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

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

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


    Вот пример:

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

     Здравствуйте
     Мир!
    

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

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

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

      SGVsbG8sCndvcmxkIQ == 

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

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

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

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

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

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

    Вместо:

      {binary gibberish that breaks XML parsers} {binary gibberish that breaks XML parsers}  

    вы делаете:

      j23894uaiAJSD3234kljasjkSD... Ja3k23JKasil3452AsdfjlksKsasKD...  

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

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

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

    Раньше разные приложения имели разные требования и, следовательно, иногда применяли базовые кодировки несколькими разными способами. Сегодня спецификации протокола иногда используют базовые кодировки в целом и «base64», в частности, без точного описания или ссылки. Многоцелевые расширения электронной почты Интернета (MIME) [4] часто используются в качестве ссылки для base64 без учета последствий для строк или символов без алфавита. objective этой спецификации – установить общие требования к алфавиту и кодированию. Это, мы надеемся, уменьшит двусмысленность в других документах, что приведет к лучшей совместимости.

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

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

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

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

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

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

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

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

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

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

    MIME-версия: 1.0
    Content-Description: «Base64 encode a.gif»
    Content-Type: image / gif; Name = “A.gif”
    Контент-кодирование контента: Base64
    Content-Disposition: вложение; имя файла = “a.gif”

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

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

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

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

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

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

     
    Here's a pic I took in Moscow.

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

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

    Я думаю, что этот код не сработает.

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

     document.getElementById("18GerPD8fY4iTbNpC9hHNXNHyrDMampPLA"); 

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

    Хотел бы я знать о Base64 лет назад. Я бы не стал рвать мои волосы « encodeURIComponent » и str.replace('\n','\\n')

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Почему / Как мы используем кодировку 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. Получателю придется отменить этот процесс, чтобы восстановить исходное сообщение.
    Давайте будем гением компьютера.