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 (по умолчанию) |
ascii | 7-bit ASCII |
latin1 | ISO-8859-1 |
hex | Шестнадцатеричная |
base64 | Base64 |
base64url | URL-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'Проверь себя
- Чем
allocотличается отallocUnsafe? - Как конвертировать строку в Base64?
- Что такое big-endian и little-endian?