Введение

Buffer — это свойство объекта в глобальном объекте Node js, которое активно используется в Node для работы с потоками двоичных данных. Поскольку он доступен по всему миру, нет необходимости требовать его в нашем коде.

Буфер — это фрагмент памяти, выделенный вне кучи V8.V8 — это механизм JavaScript по умолчанию, на котором работают Node и Google Chrome. В Node буферы реализованы с использованием типизированного массива JavaScript (Uint8Array), но это не означает, что память, выделенная для буфера, находится внутри кучи V8. Он по-прежнему явно выделяется за пределами кучи V8.

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

Буфер и кодировка символов

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

Поскольку мы создаем строку буфера 'welcome to nodejs' (мы обсудим создание буферов через секунду), вы можете видеть, что мы получаем предварительный просмотр шестнадцатеричной последовательности. Это потому, что мы не указали кодировку символов.

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

Вы можете видеть, что когда к буферу применяются разные кодировки символов, мы получаем разные результаты. Вот как кодировка символов может изменить наши данные. Если методу не задан аргумент, по умолчанию используется кодировка «utf8».

Различные типы поддерживаемых кодировок символов в Node js:

  • «ASCII»: только для 7-битных данных ASCII.
  • ‘utf8’: многобайтовые кодированные символы Unicode.
  • ‘utf16le’: 2 или 4 байта, символы Unicode, закодированные с прямым порядком байтов.
  • ‘ucs2’: Псевдоним ‘utf16le’.
  • «base64»: кодировка Base 64.
  • «latin1»: способ кодирования буфера в однобайтовую закодированную строку.
  • 'binary': Псевдоним для 'latin1'.
  • «hex»: кодировать каждый байт как два шестнадцатеричных символа.

Создание буфера

Существует три способа создания буферов:

  1. Буфер.из()
  2. Буфер.alloc()
  3. Буфер.allocUnsafe()

Буфер.из()

Buffer.from используется для создания буфера из массива, строки или из самого буфера.

Buffer.from('добро пожаловать в nodejs')

Отпечатки: ‹Буфер 77 65 6c 63 6f 6d 65 20 74 6f 20 6e 6f 64 65 6a 73›

Буфер.alloc()

Buffer.alloc принимает в качестве аргумента размер (целое число) и возвращает новый инициализированный буфер указанного размера (т. е. создает заполненный буфер определенного размера).

Buffer.alloc(7)

Печать: ‹Буфер 00 00 00 00 00 00 00›

Буфер.allocUnsafe()

Buffer.allocUnsafe принимает размер в качестве аргумента и возвращает новый неинициализированный буфер. Это означает, что он может содержать некоторые старые или конфиденциальные данные из вашей памяти. Поэтому его нужно использовать с осторожностью. Поскольку при создании буфера не требуется инициализация, этот метод работает быстрее, чем Buffer.alloc().

Buffer.allocUnsafe(7) может вывести: ‹Buffer d0 ed 02 00 00 00 00›

Мы видим, что в нашем буфере осталась некоторая информация, которая поступает непосредственно из нашей памяти. Чтобы защитить нашу конфиденциальную информацию, нам нужно предварительно заполнить этот буфер, и мы делаем это с помощью метода fill().

Buffer.allocUnsafe(7).fill() Выводит: ‹Buffer 00 00 00 00 00 00 00›

Вывод

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

использованная литература