JS Tower
Node.jsМодуль 3: Файловая система

Буферы

Работа с бинарными данными

Цель урока

В этом уроке ты научишься:

  • Создавать и использовать Buffer
  • Работать с кодировками
  • Преобразовывать данные

Что такое Buffer

Buffer — это область памяти для работы с бинарными данными.

// Создание из строки
const buf = Buffer.from('Привет');
console.log(buf);
// <Buffer d0 9f d1 80 d0 b8 d0 b2 d0 b5 d1 82>

console.log(buf.length);  // 12 байт (UTF-8)
console.log(buf.toString());  // 'Привет'

Создание Buffer

Buffer.from

// Из строки
const buf1 = Buffer.from('Hello');

// Из массива байт
const buf2 = Buffer.from([72, 101, 108, 108, 111]);

// Из другого Buffer
const buf3 = Buffer.from(buf1);

// С указанием кодировки
const buf4 = Buffer.from('48656c6c6f', 'hex');
const buf5 = Buffer.from('SGVsbG8=', 'base64');

Buffer.alloc

// Выделение памяти (заполнено нулями)
const buf = Buffer.alloc(10);
console.log(buf);
// <Buffer 00 00 00 00 00 00 00 00 00 00>

// С заполнением
const buf2 = Buffer.alloc(10, 'a');
// <Buffer 61 61 61 61 61 61 61 61 61 61>

Buffer.allocUnsafe

// Быстрее, но может содержать старые данные
const buf = Buffer.allocUnsafe(10);
// Содержимое не определено!

Внимание

allocUnsafe не очищает память. Используй только когда точно перезапишешь все байты.


Кодировки

const buf = Buffer.from('Привет', 'utf8');

// Преобразование в разные кодировки
console.log(buf.toString('utf8'));    // Привет
console.log(buf.toString('hex'));     // d09fd180d0b8d0b2d0b5d182
console.log(buf.toString('base64'));  // 0J/RgNC40LLQtdGC
console.log(buf.toString('latin1'));  // Ð ÑивеÑ

Поддерживаемые кодировки

КодировкаОписание
utf8Многобайтовая Unicode (по умолчанию)
ascii7-bit ASCII
latin1ISO-8859-1
hexШестнадцатеричная
base64Base64
base64urlURL-safe Base64

Операции с Buffer

Запись

const buf = Buffer.alloc(10);

// Запись строки
buf.write('Hi');
console.log(buf.toString());  // 'Hi'

// Запись байта
buf[0] = 72;  // 'H'
buf[1] = 105; // 'i'

Чтение

const buf = Buffer.from('Hello');

// Чтение байта
console.log(buf[0]);  // 72

// Срез
console.log(buf.slice(0, 2).toString());  // 'He'

// Подмассив (не копирует данные)
const sub = buf.subarray(0, 2);

Сравнение

const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('ABC');
const buf3 = Buffer.from('ABD');

console.log(buf1.equals(buf2));  // true
console.log(buf1.equals(buf3));  // false

// compare возвращает -1, 0, или 1
console.log(buf1.compare(buf3)); // -1 (ABC < ABD)

Конкатенация

const buf1 = Buffer.from('Hello ');
const buf2 = Buffer.from('World');

const combined = Buffer.concat([buf1, buf2]);
console.log(combined.toString());  // 'Hello World'

Копирование

const buf1 = Buffer.from('Hello');
const buf2 = Buffer.alloc(5);

buf1.copy(buf2);
console.log(buf2.toString());  // 'Hello'

// Частичное копирование
buf1.copy(buf2, 0, 0, 2);  // target, targetStart, sourceStart, sourceEnd

Числа в Buffer

const buf = Buffer.alloc(8);

// Запись чисел
buf.writeUInt8(255, 0);           // 1 байт
buf.writeUInt16BE(1000, 1);       // 2 байта, big-endian
buf.writeUInt32LE(100000, 3);     // 4 байта, little-endian

// Чтение чисел
console.log(buf.readUInt8(0));        // 255
console.log(buf.readUInt16BE(1));     // 1000
console.log(buf.readUInt32LE(3));     // 100000

Практические примеры

Base64 кодирование

function toBase64(str) {
  return Buffer.from(str).toString('base64');
}

function fromBase64(base64) {
  return Buffer.from(base64, 'base64').toString('utf8');
}

const encoded = toBase64('Привет');  // '0J/RgNC40LLQtdGC'
const decoded = fromBase64(encoded);  // 'Привет'

Хеширование

const crypto = require('crypto');

function hash(data) {
  return crypto
    .createHash('sha256')
    .update(Buffer.from(data))
    .digest('hex');
}

console.log(hash('password'));

Практика

Задание 1: Base64

Задача: Закодируй и декодируй строку в Base64.

Решение:

const original = 'Hello, World!';
const encoded = Buffer.from(original).toString('base64');
const decoded = Buffer.from(encoded, 'base64').toString();

console.log(encoded);  // 'SGVsbG8sIFdvcmxkIQ=='
console.log(decoded);  // 'Hello, World!'

Задание 2: Hex

Задача: Преобразуй строку в hex и обратно.

Решение:

const str = 'Node.js';
const hex = Buffer.from(str).toString('hex');
const back = Buffer.from(hex, 'hex').toString();

console.log(hex);   // '4e6f64652e6a73'
console.log(back);  // 'Node.js'

Проверь себя

  1. Чем alloc отличается от allocUnsafe?
  2. Как конвертировать строку в Base64?
  3. Что такое big-endian и little-endian?