Ваша первая ошибка - думать, что кодировка ASCII и кодировка Base64 взаимозаменяемы. Они не. Они используются для разных целей.
- Когда вы кодируете текст в ASCII, вы начинаете с текстовой строки и преобразуете ее в последовательность байтов.
- Когда вы кодируете данные в Base64, вы начинаете с последовательности байтов и преобразуете ее в текстовую строку.
Чтобы понять, почему Base64 был необходим в первую очередь, нам нужно немного истории вычислений.
Компьютеры общаются в двоичном формате - 0 и 1 - но люди обычно хотят общаться с более богатыми данными, такими как текст или изображения. Для передачи этих данных между компьютерами их сначала нужно кодировать в 0 и 1, отправлять, а затем снова декодировать. Чтобы взять текст в качестве примера - есть много разных способов выполнить эту кодировку. Было бы намного проще, если бы мы все могли договориться об одной кодировке, но, к сожалению, это не так.
Первоначально было создано много разных кодировок (например, Код Бодо ), в которых использовалось разное количество битов на символ, пока в конечном итоге ASCII не стал стандартом с 7 битами на символ. Однако большинство компьютеров хранят двоичные данные в байтах, состоящих из 8 битов, поэтому ASCII не подходит для передачи данных этого типа. Некоторые системы даже стирают самый важный бит. Кроме того, разница в кодировках окончания строк в разных системах означает, что символы ASCII 10 и 13 также иногда изменялись.
Для решения этих проблем была введена кодировка Base64 . Это позволяет вам кодировать байты aribtrary в байты, которые, как известно, безопасны для отправки без повреждения (буквенно-цифровые символы 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 в виде строки Base64:
SGVsbG8sCndvcmxkIQ==
Что при кодировании с использованием ASCII выглядит следующим образом:
83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61
Все байты здесь являются известными безопасными байтами, поэтому вероятность того, что любая система испортит это сообщение, очень мала. Я могу отправить это вместо моего исходного сообщения и позволить получателю отменить процесс, чтобы восстановить исходное сообщение.