Node.js Buffer — Буфер

348

Від автора: чистий JavaScript є Unicode-оптимізованим, але це не відноситься до двійковим даними. При роботі з потоками TCP або файловою системою необхідно обробляти потоки октетів. Node надає клас Buffer, який містить екземпляри об’єктів для зберігання необроблених даних, подібних масиву цілих чисел, але відповідних рядках пам’яті, які зберігаються поза V8.

В Node js Buffer — це глобальний клас, доступ до якого здійснюється у додатку без імпорту модуля буферизації.

Створення буферів

Node Buffer може бути створений різними способами. Спосіб 1. Нижче наведено синтаксис створення неинициализированного буфера в 10 октетів:

var buf = new Buffer(10);

Спосіб 2. Нижче наведено синтаксис створення буфера з заданого масиву:

var buf = new Buffer([10, 20, 30, 40, 50]);

Спосіб 3. Нижче наведено синтаксис створення буфера з заданого рядка і додаткового параметра — тип кодування:

var buf = new Buffer(“Simply Easy Learning”, “utf-8”);

Хоча «utf8» є кодуванням за замовчуванням, ви можете використовувати будь-які з наступних кодувань: «ascii», «utf8», «utf16le», «ucs2», «base64» або «hex».

Запис у буфер

Синтаксис. Нижче наведено синтаксис методу для запису в буфер Node:

buf.write(string[, offset][, length][, encoding])

Параметри. Нижче наводиться опис використовуваних параметрів –

string — це рядкові дані, які повинні бути записані в буфер.

offset — це індекс буфера, з якого починається запис. Значення за замовчуванням — 0.

length — це кількість байтів для запису. За замовчуванням — buffer.length.

encoding – використовується кодування. ‘utf8’ — це кодування за замовчуванням.

Повернене значення

Цей метод повертає кількість записаних октетів. Якщо в буфері недостатньо місця для розміщення всієї рядка, буде записана частина рядка.

Приклад

buf = new Buffer(256);
len = buf.write(“Simply Easy Learning”);
console.log(“Octets written : “+ len);

Після виконання наведеної вище програми, ми отримаємо наступний результат:

Octets written : 20

Читання з буфера

Синтаксис. Нижче наведено синтаксис методу для читання даних з буфера Node:

buf.toString([encoding] [start][, end])

Параметри

Нижче наводиться опис використовуваних параметрів:

encoding – використовується кодування. ‘utf8’ — це кодування за замовчуванням.

start — індекс, з якого починається зчитування даних, за замовчуванням — 0.

end –індекс на якому закінчується зчитування з буфера, за замовчуванням – закінчення буфера.

Повернене значення

Цей метод декодує і повертає рядок з буфера даних, закодованих з використанням зазначеної кодування.

Приклад

buf = new Buffer(26);
for (var i = 0 ; i < 26 ; i++) {
buf = i + 97;
}
console.log( buf.toString(‘ascii’)); // outputs: abcdefghijklmnopqrstuvwxyz
console.log( buf.toString(‘ascii’,0,5)); // outputs: abcde
console.log( buf.toString(‘utf8’,0,5)); // outputs: abcde
console.log( buf.toString(undefined,0,5)); // encoding defaults to ‘utf8’, outputs abcde

Після виконання наведеної вище програми, ми отримаємо наступний результат:

abcdefghijklmnopqrstuvwxyz
abcde
abcde
abcde

Перетворення буфера в JSON

Синтаксис. Нижче наведено синтаксис методу перетворення буфера Node в об’єкт JSON:

buf.toJSON()

Повернене значення

Цей метод повертає JSON-подання примірника Buffer.

Приклад

var buf = new Buffer(‘Simply Easy Learning’);
var json = buf.toJSON(buf);
console.log(json);

Після виконання наведеної вище програми, ми отримаємо наступний результат:

[ 83, 105, 109, 112, 108, 121, 32, 69, 97, 115, 121, 32, 76, 101, 97, 114, 110, 105, 110,
103 ]

Конкатенація буферів

Синтаксис. Нижче наведено синтаксис методу для конкатенації буферів Node в один буфер Node:

Buffer.concat(list[, totalLength])

Параметри

Нижче наводиться опис використовуваних параметрів –

list — список масивів об’єктів Buffer, які будуть об’єднані.

totalLength — це загальна довжина буферів для конкатенирования.

Повернене значення

Цей метод повертає екземпляр Buffer.

Приклад

var buffer1 = new Buffer(‘TutorialsPoint ‘);
var buffer2 = new Buffer(‘Simply Easy Learning’);
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log(“buffer3 content:” + buffer3.toString());

Після виконання наведеної вище програми, ми отримаємо наступний результат:

buffer3 content: TutorialsPoint Simply Easy Learning

Порівняння буферів

Синтаксис. Нижче наведено синтаксис методу порівняння двох буферів Node:

buf.compare(otherBuffer);

Параметри

Нижче наводиться опис використовуваних параметрів –

otherBuffer — це другий буфер, який буде порівнюватися з buf

Повернене значення

Повертає число, яке вказує наскільки другий буфер перевершує або менше, або відповідає buf.

Приклад

var buffer1 = new Buffer(‘ABC’);
var buffer2 = new Buffer(‘ABCD’);
var result = buffer1.compare(buffer2);
if(result < 0) {
console.log(buffer1 +” comes before ” + buffer2);
}else if(result == 0){
console.log(buffer1 +” same as is ” + buffer2);
}else {
console.log(buffer1 +” comes after ” + buffer2);
}

Після виконання наведеної вище програми, ми отримаємо наступний результат:

ABC comes before ABCD

Копіювання буфера

Синтаксис. Нижче наведено синтаксис методу копіювання буфера Node:

buf.copy(targetBuffer[, targetStart][, sourceStart][, sourceEnd])

Параметри

Нижче наводиться опис використовуваних параметрів:

targetBuffer — об’єкт буфера який буде скопійований в буфер.

targetStart — число, необов’язковий, за замовчуванням: 0

sourceStart — число, необов’язковий, за замовчуванням: 0

sourceEnd — число, необов’язковий, за замовчуванням: buffer.length

Повернене значення

Не повертає значення. Копіює дані з області цього буфера в область цільового буфера, навіть якщо область цільової пам’яті менше початкової. Якщо це явно не встановлено, для параметрів targetStart і sourceStart за замовчуванням задається значення 0, а для sourceEnd — buffer.length.

Приклад

var buffer1 = new Buffer(‘ABC’);
//копіювання буфера
var buffer2 = new Buffer(3);
buffer1.copy(buffer2);
console.log(“buffer2 content:” + buffer2.toString());

Після виконання наведеної вище програми, ми отримаємо наступний результат:

buffer2 content: ABC

Виділення буфера

Синтаксис. Нижче наведено синтаксис методу для отримання подбуфера буфера Node:

buf.slice([start][, end])

Параметри

Нижче наводиться опис використовуваних параметрів:

start — число, необов’язковий, за замовчуванням: 0

end — число, необов’язковий, за замовчуванням: buffer.length

Повернене значення

Повертає новий буфер, який посилається на ту ж область пам’яті, що і старий буфер, але обмежену індексами start (за умовчанням 0) і end (за замовчуванням buffer.length). Від’ємні індекси відраховуються з кінця буфера.

Приклад

var buffer1 = new Buffer(‘TutorialsPoint’);
//виділення буфера
var buffer2 = buffer1.slice(0,9);
console.log(“buffer2 content:” + buffer2.toString());

Після виконання наведеної вище програми, ми отримаємо наступний результат:

buffer2 content: Tutorials

Довжина буфера

Синтаксис. Нижче наведено синтаксис методу для отримання розміру буфера Node у байтах:

buf.length;

Повернене значення

Повертає розмір буфера в байтах.

Приклад

var buffer = new Buffer(‘TutorialsPoint’);
//довжина буфера
console.log(“buffer length:” + buffer.length);

Після виконання наведеної вище програми, ми отримаємо наступний результат:

buffer length: 14

Опис методів

Нижче наведено опис методів, доступних в Node.js. Більш детальну інформацію ви можете знайти в офіційній документації.

Методи класів

Buffer.isEncoding(encoding) — Повертає true, якщо кодування є допустимим аргументом кодування, інакше false.

Buffer.isBuffer(obj) — Перевіряє, чи є obj буфером.

Buffer.byteLength(string[, encoding]) — Повертає фактичну довжину рядка в байтах. Кодування за замовчуванням — ‘utf8’. Це не те ж саме, що й String.prototype.length, оскільки String.prototype.length-повертає кількість символів в рядку.

Buffer.concat(list[, totalLength]) — Повертає буфер, який є результатом об’єднання всіх буферів у списку.

Buffer.compare(buf1, buf2) — Те ж, що і buf1.compare (buf2). Використовується для сортування масивів даних.