Base64
Base64 (за основою 64) – це група споріднених кодувань перетворення з двійкової у текстову форму, що представляють двійкові дані у вигляді рядка ASCII за допомогою перетворення їх на представлення з системою числення 64. Термін Base64 походить від конкретного кодування передачі вмісту MIME.
Коли термін "Base64" вживається сам по собі на позначення певного алгоритму, він зазвичай означає версію Base64, описану у RFC 4648, розділі 4, яка використовує наступний алфавіт для представлення розрядних цифр системи числення 64, разом із =
як символом відступу:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Поширена варіація – "безпечний для URL Base64", котрий пропускає відступ і замінює +/
на -_
, щоб уникнути символів, які можуть створювати проблеми у сегментах шляху URL і параметрах запиту. У цьому кодуванні немає потреби, якщо ви не кладете дані в сегмент шляху чи параметр запиту: наприклад, адреси URL даних не мають ані першого, ані другого, а отже можуть використовувати стандартне кодування Base64.
Схеми кодування Base64 заведено використовувати для кодування двійкових даних для зберігання чи передачі засобами, що можуть працювати лише з текстом ASCII (або певною надмножиною ASCII, що все одно не здатна приймати довільні двійкові дані). Це забезпечує, що дані залишаються незмінними під час транспортування. Поширені застосування Base64:
- Електронна пошта через MIME
- Зберігання складних даних у XML
- Кодування двійкових даних, щоб їх можна було включити в URL-адресу
data:
Збільшення розміру при кодуванні
Кожна цифра Base64 представляє 6 біт даних. Отже, три 8-бітові байти вихідного рядка чи двійкового файлу (3×8 біт = 24 біти) можна представити чотирма 6-бітовими цифрами Base64 (4×6 = 24 біти).
Це означає, що версія рядка чи файлу в Base64 зазвичай приблизно на третину більша за вихідні дані (точний приріст розміру залежить від різних факторів, таких як абсолютна довжина рядка, остача від ділення його довжини на 3 та те, чи використовуються символи відступу).
Остання порція
Рядок base64 можна поділити на чотирисимвольні порції, де в останній порції може бути менш як 4 символів. Ця порція може бути доповнена символами =
, щоб складатися рівно з 4 символів. Коли не рахувати символи доповнення, остання порція може бути чимось із наступного:
- 2 символи: кодує 12 бітів, що представляють 1 байт (8 бітів) даних
- 3 символи: кодує 18 бітів, що представляють 2 байти (16 байтів) даних
- 4 символи: кодує 24 біти, що представляють 3 байти (24 біти) даних
У перших двох випадках символи можуть мати додаткові 4 або 2 додаткові біти в кінці, що не представляють жодних даних. У такому разі RFC 4648 вимагає, аби кодувальники задавали в цих бітах нулі, а декодувальники – (необов'язково) викидали помилку, коли в цих бітах не нулі. Наприклад, якщо закодовані дані є одним байтом 0b01010101
, де другий символ має 4 біти в кінці, задані нулями. Декодування VR==
(де другий символ представляє 0b010001
) технічно призводить до того самого байта 0b01010101
, проте декодувальник може викинути помилку, адже біти в кінці – не нульові.
Підтримка в JavaScript
Клас Uint8Array
пропонує для перетворення даних на та із base64 методи Uint8Array.fromBase64()
, Uint8Array.prototype.toBase64()
і Uint8Array.prototype.setFromBase64()
.
Також для розкодування та кодування рядків Base64 браузери надають дві функції JavaScript:
Window.btoa()
(також доступна у воркерах) – створює рядок ASCII, закодований Base64, з рядка двійкових даних ("btoa" слід читати як "binary to ASCII", "двійкове в ASCII").Window.atob()
(також доступна у воркерах) – розкодовує рядок, закодований Base64 ("atob" слід читати як "ASCII to binary", "ASCII у двійкове").
[!NOTE] Base64 – це двійкове кодування, а не текстове, але
btoa
таatob
були додані до вебплатформи до того, як вона почала підтримувати двійкові типи даних. В результаті ці дві функції використовують рядки для представлення двійкових даних, при чому кодова точка кожного символу представляє значення кожного байта. Це призвело до поширеного неправильного розуміння, нібиbtoa
можна використовувати для кодування довільних текстових даних – наприклад, створення Base64data:
URL текстового чи HTML-документа.Проте відповідність між байтами та кодовими точками надійно виконується лише для кодових точок до
0x7f
. Крім того, кодові точки понад0xff
призведуть до викидання помилкиbtoa
, через перевищення максимального значення для 1 байта. Наступний розділ детально описує, як обійти це обмеження при кодуванні довільного тексту Unicode.
Дивіться також
- API JavaScript:
Window.atob()
(також доступна у воркерах)Window.btoa()
(також доступна у воркерах)Uint8Array
- URL даних
- Base64 на Вікіпедії
- Алгоритм Base64, описаний у RFC 4648