Кодирование и декодирование строк Base64 в Node.js

* Что такое кодировка Base64? * Как работает Base64? * Зачем использовать кодировку Base64? * Кодирование строк Base64 с помощью Node.js * Декодирование строк Base64 с помощью Node.js * Кодирование двоичных данных в строки Base64 * Декодирование строк Base64 в двоичные данные * Заключение Что такое кодирование Base64? Кодировка Base64 - это способ преобразования данных (обычно двоичных) в набор символов ASCII. Здесь важно упомянуть, что Base64 не является техникой шифрования или сжатия, хотя иногда это может сбивать с толку.

Что такое кодировка Base64?

Кодировка Base64 - это способ преобразования данных (обычно двоичных) в набор символов ASCII. Здесь важно упомянуть, что Base64 не является методом шифрования или сжатия, хотя иногда его можно принять за шифрование из-за того, что он скрывает данные. Фактически, размер информации, закодированной в Base64, в 1,3333 раза больше фактического размера ваших исходных данных.

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

Как работает Base64?

Преобразование данных в base64 - это многоэтапный процесс. Вот как это работает со строками текста:

  1. Вычислить 8-битную двоичную версию входного текста
  2. Сгруппируйте 8-битную версию данных в несколько блоков по 6 бит.
  3. Найдите десятичную версию каждого 6-битного двоичного фрагмента
  4. Найдите символ Base64 для каждого десятичного значения с помощью таблицы поиска Base64.

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

Предположим, у нас есть строка «Go win», и мы хотим преобразовать ее в строку Base64. Первый шаг - преобразовать эту строку в двоичную. Бинарная версия "Go win":

01000111 01101111 00100000 01110111 01101001 01101110

Вы можете видеть здесь, что каждый символ представлен 8 битами. Однако, как мы уже говорили ранее, Base64 преобразует данные из 8-битной двоичной формы в блоки по 6 бит. Это связано с тем, что в формате Base64 всего 64 символа: 26 букв алфавита в верхнем регистре, 26 букв алфавита в нижнем регистре, 10 цифровых символов и символы «+» и «/» для новой строки.

Base64 использует не все специальные символы ASCII, а только некоторые из них. Обратите внимание, что в некоторых реализациях Base64 используются специальные символы, отличные от «+» и «/».

Возвращаясь к примеру, давайте разберем наши 8-битные данные на 6-битные блоки.

010001 110110 111100 100000 011101 110110 100101 101110

Вы не всегда сможете разделить данные на полные наборы по 6 бит, и в этом случае вам придется иметь дело с заполнением .

Теперь для каждого приведенного выше фрагмента нам нужно найти его десятичное значение. Эти десятичные значения приведены ниже:

 Binary Decimal 
 010001 17 
 110110 54 
 111100 60 
 100000 32 
 011101 29 
 110110 54 
 100101 37 
 101110 46 

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

Таблица поиска десятичных чисел вBase64{.ezlazyload}

Здесь вы можете видеть, что десятичное 17 соответствует «R», а десятичное 54 соответствует «2» и так далее. Используя эту таблицу кодирования, мы видим, что строка «Go win» кодируется как «R28gd2lu» с использованием Base64. Вы можете использовать любой онлайн-конвертер текста в Base64, чтобы проверить этот результат.

Зачем использовать кодировку Base64?

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

Например, почтовые серверы ожидают текстовые данные, поэтому обычно используется ASCII. Поэтому, если вы хотите отправить изображения или любой другой двоичный файл на почтовый сервер, вам сначала нужно закодировать его в текстовом формате, предпочтительно ASCII. Вот где кодировка Base64 чрезвычайно удобна для преобразования двоичных данных в правильные форматы.

Кодирование строк Base64 с помощью Node.js

Самый простой способ кодировать строки Base64 в Node.js - использовать объект Buffer. В Node.js Buffer

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

Внутренний Buffer - это неизменяемый массив целых чисел, который также может выполнять множество различных кодировок / декодирований. К ним относятся кодировки в / из UTF-8, UCS2, Base64 или даже Hex. Когда вы пишете код, который имеет дело с данными и управляет ими, вы, вероятно, в какой-то момент Buffer

Взгляните на следующий пример. Здесь мы будем кодировать текстовую строку в Base64 с помощью объекта Buffer Сохраните следующий код в файле "encode-text.js".

 'use strict'; 
 
 let data = 'stackabuse.com'; 
 let buff = new Buffer(data); 
 let base64data = buff.toString('base64'); 
 
 console.log('"' + data + '" converted to Base64 is "' + base64data + '"'); 

В приведенном выше сценарии мы создаем новый объект буфера и передаем ему нашу строку, которую хотим преобразовать в Base64. Затем мы вызываем метод toString для только что созданного буферного объекта и передаем ему base64 в качестве параметра. Метод toString с параметром base64 вернет данные в виде строки Base64. Запустите приведенный выше код, вы увидите следующий результат.

 $ node encode-text.js 
 "stackabuse.com" converted to Base64 is "c3RhY2thYnVzZS5jb20=" 

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

Расшифровка строк Base64 с помощью Node.js

Расшифровка строки Base64 очень похожа на ее кодирование. Вам необходимо создать новый буферный объект и передать его конструктору два параметра. Первый параметр - это данные в Base64, а второй параметр - «base64». Затем вам просто нужно вызвать «toString» для объекта буфера, но на этот раз параметром, переданным методу, будет «ascii», потому что это тип данных, в который вы хотите преобразовать данные Base64. Взгляните на следующий фрагмент кода для справки.

 'use strict'; 
 
 let data = 'c3RhY2thYnVzZS5jb20='; 
 let buff = new Buffer(data, 'base64'); 
 let text = buff.toString('ascii'); 
 
 console.log('"' + data + '" converted from Base64 to ASCII is "' + text + '"'); 

Добавьте данные в файл «ascii.js» и сохраните его. Здесь мы использовали «Tm8gdG8gUmFjaXNt» в качестве входных данных Base64. После декодирования этих данных должно отображаться сообщение «Нет расизму». Это потому, что из последнего примера мы знаем, что «Нет расизму» равно «Tm8gdG8gUmFjaXNt». Запустите приведенный выше код с помощью Node.js. Он отобразит следующий результат.

Кодирование двоичных данных в строки Base64

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

 'use strict'; 
 
 const fs = require('fs'); 
 
 let buff = fs.readFileSync('stack-abuse-logo.png'); 
 let base64data = buff.toString('base64'); 
 
 console.log('Image converted to base 64 is:\n\n' + base64data); 

В приведенном выше коде мы загружаем изображение в буфер с помощью readFileSync() модуля fs Остальная часть процесса аналогична созданию строки Base64 из обычной строки ASCII.

Когда вы запустите приведенный выше код, вы увидите следующий результат.

 $ node encode-image.js 
 Image converted to Base64 is: 
 
 iVBORw0KGgoAAAANSUhEUgAAABkAAAATCAYAAABlcqYFAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAADuUlEQVQ4EbVUTUtcZxR+7ufkXp1SZ4iZRE1EDVQRnTAhowsZMFm40I2rNqUIIev8hvoPQroQXBTqwiAWcd0EglEhiZNajVZrQGXAWAzaZpzMnZn7lXPeeIe5DaWb9Ax33vOec8/znI/3vVI6nfbxP4v8b/iSJIGfzyGfkPi+D13XUalUBL6qqmIvy5+8WuX/r2RCkUzAoIuLi2hqaoLrutjb28P6+josyxJkiqJA07SQXiqVwHaOZYx/itLc3Px9YIxEIlheXsbExATGxsYwMjIiwEdHRwXA/Pw8EokEcrkcDg4OYJomVlZWMDU1JSqfmZlBR0cHbNsOtVoNCHjlTFiSySQMwxAVxONxQbi0tIRMJoPe3l5MT0+jtbUVg4ODYGImY18qlcL4+DhisZjoggCjv1C7uOyenh7Mzs5iY2ND6FQpdnd3sba2JloSjUYxPDyM/v5+TE5OYn9/X9jZtrOzg+3t7WqyAUmoEu419/+HBw9E+eVymbJqAJP39fWBCR3HEU+hUMDQ0JCYGc8um81iYGAAjY2N8DwvwBdraCY8tHhDA1Y3N9Hd3S2yvH37O7RcbsF7AuUsD9+8wdOFBTx/8QJtbW1C5/nMzc3R0D2UyxXk83lRXcAk1V5GCT5sSUGDbeHxy9/EO98M9OOXzT9wfHISxKC1vR0GHfOtrS2g/SouWwU0Xkggu7qO9PUkJFULnbIQyTm6ewu2hF+vnOIIUQwdGlg8f4QF6wvMWBq+pAkaskSnx4FFVUf0CNpcC797KizXQ4oAHhVdXJJ81F7j6kwUynPHlXDPdFB2fRj+KVK0KvT2rbp3uKYryJU11Cke8qqMuOoioeeJ1MPDYxM36m1cNSq4GdFx58RAWvbx8TrXnK4IgR16Em5GK4iqHi5GHHxLgcSDn97WgZPoND+GGZRpPYH85cgiiRQl1ltXxmFFQ5PuopP8TrW5ZyRcWp7AbmkeZefg5+N6PPnbRJdpw/YlfB0vQiPQZwVdZNtFZEVK6D1VTnccJlXzuqTjvOZiq6Rhj2KqLSJsofOHgIl8+t0/qsfDioxmSUWGjrRFzhYi/5Oynrdl3KXHIZDXtF6hil8R6I9FBV/RvDLnXKxSbAdVYhNeINXBMwmXWCTQGG2Y+Jj+dFrfEmiMAtmeowpo9ojTvkD+A/L1UJUMmiVfkuz6WTyZhFRJAgP33j3bsM5k/Fng68UP21hYJyyxZwLWuS2cKMfUSm3rhD0g4E2g197fwMZ+Bgt8rNe2iP2BhL5dgfFzrx8AfECEDdx45a0AAAAASUVORK5CYII= 

Хотя фактическое изображение очень маленькое (25x19), вывод по-прежнему остается довольно большим, частично из-за того, что Base64 увеличивает размер данных, как мы упоминали ранее.

Декодирование строк Base64 в двоичные данные

Обратный процесс здесь очень похож на то, как мы декодируем строки Base64, как мы видели в предыдущем разделе. Самая большая разница - это назначение вывода и то, как туда записываются данные. Посмотрим на пример:

 'use strict'; 
 
 const fs = require('fs'); 
 
 let data = 'iVBORw0KGgoAAAANSUhEUgAAABkAAAATCAYAAABlcqYFAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAA' + 
 'CA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0' + 
 'YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly' + 
 '93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAg' + 
 'ICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZm' + 
 'Y6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAADuUlEQVQ4EbVU' + 
 'TUtcZxR+7ufkXp1SZ4iZRE1EDVQRnTAhowsZMFm40I2rNqUIIev8hvoPQroQXBTqwiAWcd0EglEhiZNajVZrQGXAWAzaZpzMnZn7lXPeeIe5Da' + 
 'Wb9Ax33vOec8/znI/3vVI6nfbxP4v8b/iSJIGfzyGfkPi+D13XUalUBL6qqmIvy5+8WuX/r2RCkUzAoIuLi2hqaoLrutjb28P6+josyxJkiqJA' + 
 '07SQXiqVwHaOZYx/itLc3Px9YIxEIlheXsbExATGxsYwMjIiwEdHRwXA/Pw8EokEcrkcDg4OYJomVlZWMDU1JSqfmZlBR0cHbNsOtVoNCHjlTF' + 
 'iSySQMwxAVxONxQbi0tIRMJoPe3l5MT0+jtbUVg4ODYGImY18qlcL4+DhisZjoggCjv1C7uOyenh7Mzs5iY2ND6FQpdnd3sba2JloSjUYxPDyM' + 
 '/v5+TE5OYn9/X9jZtrOzg+3t7WqyAUmoEu419/+HBw9E+eVymbJqAJP39fWBCR3HEU+hUMDQ0JCYGc8um81iYGAAjY2N8DwvwBdraCY8tHhDA1' + 
 'Y3N9Hd3S2yvH37O7RcbsF7AuUsD9+8wdOFBTx/8QJtbW1C5/nMzc3R0D2UyxXk83lRXcAk1V5GCT5sSUGDbeHxy9/EO98M9OOXzT9wfHISxKC1' + 
 'vR0GHfOtrS2g/SouWwU0Xkggu7qO9PUkJFULnbIQyTm6ewu2hF+vnOIIUQwdGlg8f4QF6wvMWBq+pAkaskSnx4FFVUf0CNpcC797KizXQ4oAHh' + 
 'VdXJJ81F7j6kwUynPHlXDPdFB2fRj+KVK0KvT2rbp3uKYryJU11Cke8qqMuOoioeeJ1MPDYxM36m1cNSq4GdFx58RAWvbx8TrXnK4IgR16Em5G' + 
 'K4iqHi5GHHxLgcSDn97WgZPoND+GGZRpPYH85cgiiRQl1ltXxmFFQ5PuopP8TrW5ZyRcWp7AbmkeZefg5+N6PPnbRJdpw/YlfB0vQiPQZwVdZN' + 
 'tFZEVK6D1VTnccJlXzuqTjvOZiq6Rhj2KqLSJsofOHgIl8+t0/qsfDioxmSUWGjrRFzhYi/5Oynrdl3KXHIZDXtF6hil8R6I9FBV/RvDLnXKxS' + 
 'bAdVYhNeINXBMwmXWCTQGG2Y+Jj+dFrfEmiMAtmeowpo9ojTvkD+A/L1UJUMmiVfkuz6WTyZhFRJAgP33j3bsM5k/Fng68UP21hYJyyxZwLWuS' + 
 '2cKMfUSm3rhD0g4E2g197fwMZ+Bgt8rNe2iP2BhL5dgfFzrx8AfECEDdx45a0AAAAASUVORK5CYII='; 
 
 let buff = new Buffer(data, 'base64'); 
 fs.writeFileSync('stack-abuse-logo-out.png', buff); 
 
 console.log('Base64 image data converted to file: stack-abuse-logo-out.png'); 

Здесь вы можете видеть, что мы начинаем с данных Base64 (которые также могли быть получены из сокета или какой-либо другой линии связи) и загружаем их в объект Buffer При создании буфера мы сообщаем ему, что он в base64 , что позволяет буферу соответствующим образом анализировать его для внутреннего хранилища.

Чтобы сохранить данные обратно в необработанном формате PNG, мы просто передаем Buffer в наш fs.writeFileSync и он выполняет преобразование за нас.

Заключение

Кодирование Base64 - один из наиболее распространенных способов преобразования двоичных данных в простой текст ASCII. Это очень полезный формат для связи между одной или несколькими системами, которые не могут легко обрабатывать двоичные данные, такие как изображения в разметке HTML или веб-запросы.

В Node.js Buffer можно использовать для кодирования и декодирования строк Base64 во многие другие форматы и обратно, что позволяет легко конвертировать данные туда и обратно по мере необходимости.

Для чего вы обычно используете форматирование Base64 в Node.js? Дайте нам знать об этом в комментариях!

comments powered by Disqus