Что такое буфер?
Буфер – это область памяти. Разработчики JavaScript не знакомы с этой концепцией, гораздо меньше, чем разработчики C, C++ или Go (или любой программист, использующий системный язык программирования), которые каждый день взаимодействуют с памятью.
Он представляет собой фрагмент памяти фиксированного размера (не может быть изменен), выделенный за пределами движка JavaScript V8.
Вы можете представить буфер как массив целых чисел, каждое из которых представляет собой байт данных.
Он реализован классом Node Буфер .
Зачем нам нужен буфер?
Буферы были введены, чтобы помочь разработчикам работать с двоичными данными в экосистеме, которая традиционно имела дело только со строками, а не с двоичными файлами.
Буферы тесно связаны с потоками. Когда потоковый процессор получает данные быстрее, чем он может переварить, он помещает их в буфер.
Простая визуализация буфера – это когда вы смотрите видео на YouTube, и красная линия выходит за пределы вашей точки визуализации: вы загружаете данные быстрее, чем просматриваете, и ваш браузер буферизует их.
Как создать буфер
Буфер создается с помощью методов Buffer.from() , Buffer.alloc() и Buffer.alloc() .
const buf = Buffer.from('Hey!')Буфер.из (массива)Буфер.из(массивбуфера [, byteOffset[, длина]])Буфер.из (буфера)Буфер.из(строка[, кодировка])
Вы также можете просто инициализировать буфер, передавая размер. Это создает буфер размером 1 КБ:
const buf = Buffer.alloc(1024) //or const buf = Buffer.allocUnsafe(1024)
Использование буфера
Доступ к содержимому буфера
Буфер, представляющий собой массив байтов, может быть доступен как массив:
const buf = Buffer.from('Hey!')
console.log(buf[0]) //72
console.log(buf[1]) //101
console.log(buf[2]) //121
Эти числа являются кодом Юникода, который идентифицирует символ в позиции буфера (H => 72, e => 101, y => 121)
Вы можете распечатать полное содержимое буфера с помощью метода toString() :
console.log(buf.toString())
Обратите внимание, что если вы инициализируете буфер числом, задающим его размер, вы получите доступ к предварительно инициализированной памяти, которая будет содержать случайные данные, а не пустой буфер!
Получить длину буфера
Используйте свойство длина :
const buf = Buffer.from('Hey!')
console.log(buf.length)Перебор содержимого буфера
const buf = Buffer.from('Hey!')
for (const item of buf) {
console.log(item) //72 101 121 33
}Изменение содержимого буфера
Вы можете записать в буфер целую строку данных с помощью метода write() :
const buf = Buffer.alloc(4)
buf.write('Hey!')Точно так же, как вы можете получить доступ к буферу с помощью синтаксиса массива, вы также можете установить содержимое буфера таким же образом:
const buf = Buffer.from('Hey!')
buf[1] = 111 //o
console.log(buf.toString()) //Hoy!
Копирование буфера
Копирование буфера возможно с помощью метода copy() :
const buf = Buffer.from('Hey!')
let bufcopy = Buffer.alloc(4) //allocate 4 bytes
buf.copy(bufcopy)По умолчанию вы копируете весь буфер целиком. еще 3 параметра позволяют определить начальную позицию, конечную позицию и новую длину буфера:
const buf = Buffer.from('Hey!')
let bufcopy = Buffer.alloc(2) //allocate 2 bytes
buf.copy(bufcopy, 0, 2, 2)
bufcopy.toString() //'He'
Вырезать буфер
Если вы хотите создать частичную визуализацию буфера, вы можете создать срез. Фрагмент не является копией: исходный буфер по-прежнему является источником истины. Если это изменится, изменится и ваш срез.
Для его создания используйте метод slice() . Первый параметр – это начальная позиция, и вы можете указать необязательный второй параметр с конечной позицией:
const buf = Buffer.from('Hey!')
buf.slice(0).toString() //Hey!
const slice = buf.slice(0, 2)
console.log(slice.toString()) //He
buf[1] = 111 //o
console.log(slice.toString())Оригинал: “https://flaviocopes.com/node-buffers/”