Рассказываем, что такое кодировка Base64, как она работает, для чего применяется, на примере популярных языков программирования.
Что такое кодировка Base64 и зачем она нужна
Кодировка Base64 — это один из способов представления данных. А именно — это способ кодирования двоичных данных в виде текста. Для текста используются символы из набора ASCII. Сама идея такого кодирования довольно проста: любая информация в компьютере (изображение, текст и тому подобное) — это набор единиц и нулей, то есть двоичный код. Этот код нужно разделить на блоки и представить в виде символов. Каждый блок из трех байтов (24 бита) преобразуется в четыре символа ASCII.
Такой метод кодирования позволяет передавать информацию по тем каналам, которые не предназначены для передачи двоичных данных. Следует понимать, что это не шифрование и такой способ кодирования никак не обеспечивает безопасность данных, так как легко декодируется.
Как работает кодировка Base64
Для начала нужно представить данные в байтовом виде. Это значит, что необходимо из двоичных данных получить группы, состоящие из восьми бит. Для примера возьмем слово dog. Оно состоит из трех букв. В полной таблице ASCII содержатся 128 символов, и каждому символу соответствует свой номер от 0 до 127. В нашем случае номера следующие:
d — 100
o — 111
g — 103
В байтовом виде эти номера будут выглядеть так:
100 — 01100100
111 — 01101111
103 — 01100111
В итоге получаем вот такую строку из трех байтов:
01100100 01101111 01100111
Теперь из этих байтов надо получить группы по шесть бит. Зачем это делать? Все из-за того, что таблица символов ASCII для кодирования в формате Base64 состоит всего из 64 символов, так как число 64 — это количество всех возможных перестановок 0 и 1 в группе из шести бит. Вот так выглядит эта таблица:
| Index | Binary | Char. | Index | Binary | Char. | Index | Binary | Char. | Index | Binary | Char. |
| 0 | 000000 | A | 16 | 010000 | Q | 32 | 100000 | g | 48 | 110000 | w |
| 1 | 000001 | B | 17 | 010001 | R | 33 | 100001 | h | 49 | 110001 | x |
| 2 | 000010 | C | 18 | 010010 | S | 34 | 100010 | i | 50 | 110010 | y |
| 3 | 000011 | D | 19 | 010011 | T | 35 | 100011 | j | 51 | 110011 | z |
| 4 | 000100 | E | 20 | 010100 | U | 36 | 100100 | k | 52 | 110100 | 0 |
| 5 | 000101 | F | 21 | 010101 | V | 37 | 100101 | l | 53 | 110101 | 1 |
| 6 | 000110 | G | 22 | 010110 | W | 38 | 100110 | m | 54 | 110110 | 2 |
| 7 | 000111 | H | 23 | 010111 | X | 39 | 100111 | n | 55 | 110111 | 3 |
| 8 | 001000 | I | 24 | 011000 | Y | 40 | 101000 | o | 56 | 111000 | 4 |
| 9 | 001001 | J | 25 | 011001 | Z | 41 | 101001 | p | 57 | 111001 | 5 |
| 10 | 001010 | K | 26 | 011010 | a | 42 | 101010 | q | 58 | 111010 | 6 |
| 11 | 001011 | L | 27 | 011011 | b | 43 | 101011 | r | 59 | 111011 | 7 |
| 12 | 001100 | M | 28 | 011100 | c | 44 | 101100 | s | 60 | 111100 | 8 |
| 13 | 001101 | N | 29 | 011101 | d | 45 | 101101 | t | 61 | 111101 | 9 |
| 14 | 001110 | O | 30 | 011110 | e | 46 | 101110 | u | 62 | 111110 | + |
| 15 | 001111 | P | 31 | 011111 | f | 47 | 101111 | v | 63 | 111111 | / |
Итак, после разбиения трех байтов на группы по шесть бит получим уже такую строку:
011001 000110 111101 100111
Получили четыре группы по шесть бит каждая. Каждой такой группе соответствует свой номер от 0 до 63:
011001 — 25
000110 — 6
111101 — 61
100111 — 39
А каждому номеру соответствует свой символ:
25 — Z
6 — G
61 — 9
39 — n
То есть в итоге получается, что слово dog в кодировке Base64 представляется в виде набора символов ZG9n. Вроде все просто. Но, как всегда, есть один нюанс. Дело в том, что далеко не всегда биты могут делиться нацело на группы по шесть бит. Что тогда делать? В этом случае просто добавляются так называемые пустые байты. Например, если дан такой байт:
01100100
То, чтобы все удачно разделилось на группы, прибавляем к нему два пустых байта:
01100100 00000000 00000000
Далее эти пустые байты превратятся в символ «равно».
Где применяется Base64
Кодировку Base64 с успехом применяют в электронной почте. С ее помощью кодируют вложения в электронных письмах, так как протокол SMTP, через который передают письма, поддерживает только текстовый формат.
Также эту кодировку используют в веб-разработке. Вот так, например, можно отобразить на странице изображение с зеленым квадратом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Display Image</title> </head> <body> <h1>Зеленый квадрат</h1> <img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAABHNCSVQICAgIfAhkiAAAA/JJREFUeJzt1EENwCAAwMAxS7jDJYqYhf1IkzsFfXXMvc4DEPDeDgD4y7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyDAvIMCwgw7CADMMCMgwLyDAsIMOwgAzDAjIMC8gwLCDDsIAMwwIyPgizBNVa2blRAAAAAElFTkSuQmCC'/> </body> </html>
Тут все просто: в элементе img для его атрибута src в качестве значения прописываем закодированное в формате Base64 изображение. В браузере этот код будет выглядеть примерно так:

Также Base64 нашел применение в электронных книгах. Есть довольно популярный формат электронных книг — fb2. Он представляет из себя простую XML-разметку со специальными тегами, и все изображения в нем хранятся именно в виде Base64. Для этого существует элемент binary:
<binary id="green.png" content-type="image/png"> <!--Данные в формате Base64--> </binary>
Для каждого такого элемента указывается идентификатор (id) и тип контента (content-type). Содержимое binary может быть отображено в любом месте книги в уже раскодированном виде. Для этого надо только лишь прописать в нужном месте элемент image и в нем указать идентификатор в виде значения для атрибута href:
<image l:href="#green.png"/>
Помимо этого, кодировку Base64 применяют также в базах данных для хранения информации и в QR-кодах.
Base64 в программировании
Рассмотрим, как можно кодировать и декодировать информацию при помощи Base64 на популярных языках Python, Java и JavaScript.
Base64 в Python
Прежде всего в самом начале исходника необходимо прописать следующий импорт модуля base64:
import base64
Далее создаем переменную со строкой, которую будем кодировать:
text = "Skillfactory"
На следующем шаге применяем функцию b64encode из импортированного модуля base64:
encoded_text = base64.b64encode(text.encode("utf-8")).decode("utf-8")
В переменной encoded_text будет содержаться готовый результат кодирования. Отобразим его в консоли при помощи print:
print(encoded_text)
Весь исходник будет таким:
import base64
text = "Skillfactory"
encoded_text = base64.b64encode(text.encode("utf-8")).decode("utf-8")
print(encoded_text)
В консоли получим такую строку:
U2tpbGxmYWN0b3J5
А теперь раскодируем ее. Для этого вместо функции b64encode применим функцию b64decode:
import base64
encoded_text = "U2tpbGxmYWN0b3J5"
decoded_text = base64.b64decode(encoded_text).decode("utf-8")
print(decoded_text)
Результат:
Skillfactory
Base64 в Java
Здесь так же, как и в прошлом примере, надо произвести импорт. Импортируем класс Base64:
import java.util.Base64;
Дальше в главном методе main создаем объект encoder:
Base64.Encoder encoder = Base64.getEncoder();
Сразу после этого создаем строку для кодирования:
String str = "Java";
Теперь осталось только ее закодировать и вывести результат в консоль. Для кодировки вызываем метод encodeToString для объекта encoder:
String encodedString = encoder.encodeToString(str.getBytes());
Выводим в консоль переменную encodedString, в которой содержится закодированная строка:
System.out.println(encodedString);
Весь исходный код программы:
import java.util.Base64;
public class Main {
public static void main(String[] args) {
Base64.Encoder encoder = Base64.getEncoder();
String str = "Java";
String encodedString = encoder.encodeToString(str.getBytes());
System.out.println(encodedString);
}
}
Результат работы программы:
SmF2YQ==
Для раскодирования нам понадобится объект decoder из соответствующего класса. И вызывать для этого объекта нужно метод decode. В общем, код будет такой:
import java.util.Base64;
public class Main {
public static void main(String[] args) {
Base64.Decoder decoder = Base64.getDecoder();
String encodedString = "SmF2YQ==";
byte[] bytes = decoder.decode(encodedString);
System.out.println(new String(bytes));
}
}
Вывод в консоли:
Java
Base64 в JavaScript
В JavaScript для кодирования применяется функция btoa:
let string = 'Base64'; let encodedString = btoa(string); console.log(encodedString);
В консоли получим строку:
QmFzZTY0
А для декодирования используется функция atob:
let encodedString = 'QmFzZTY0' let decodedString = atob(encodedString); console.log(decodedString);
Результат:
Base64
Инструменты для кодирования и декодирования в формате Base64
Существуют удобные инструменты для работы с кодировкой Base64. Например, в UNIX-подобных системах можно закодировать и раскодировать строку, используя простые консольные команды. С помощью такой команды можно закодировать строку «Добро пожаловать!»:
echo Добро пожаловать! | base64
Результат выполнения команды:
0JTQvtCx0YDQviDQv9C+0LbQsNC70L7QstCw0YLRjCEK
А раскодировать ее можно так:
echo 0JTQvtCx0YDQviDQv9C+0LbQsNC70L7QstCw0YLRjCEK | base64 --decode
Получим:
Добро пожаловать!
Среди онлайн-инструментов имеется вот такой простенький сайт с очень минималистичным дизайном:

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

Пробуем кодировать: задание для практики
Ранее мы показали, как закодировать строку. Теперь, действуя в обратном порядке, попробуйте раскодировать следующую строчку:
Q29kZQ==
Для получения соответствующих символов можно использовать эту таблицу.
Решение
Сначала получаем шестибитовые группы по приведенной в статье таблице:
Q — 010000
2 — 110110
9 — 111101
k — 100100
Z — 011001
Q — 010000
Далее идут пустые байты. Они нам не нужны. Из полученных групп формируем байты, то есть группы из восьми бит. Просто отсчитываем слева направо по 8 бит. Получится 4 байта:
01000011 01101111 01100100 01100101
Последние четыре ноля у символа Q входят в первый пустой байт. Их просто отбрасываем. Теперь, пользуясь таблицей из вышеприведенной ссылки, находим соответствующие символы:
01000011 — C
01101111 — o
01100100 — d
01100101 — e
То есть в итоге получаем слово Code.
(Конец решения)
