Buffer în Node.js

Evenimente, stream-uri și date binare Node.js 0.1; Buffer.from din 5.10

Șir de octeți din Node.js: date binare din fișiere, rețea sau criptografie, cu conversii în text, hex și base64.

Sintaxă
Buffer.from(text, [codificare])
Buffer.alloc(mărime)
Buffer.concat([b1, b2])
buf.toString([codificare])
Buffer.byteLength(text)

Ce face Buffer

Un Buffer este o zonă de memorie cu octeți (valori de la 0 la 255). Este clasa prin care Node.js îți dă datele binare: conținutul unui fișier citit fără codificare, bucățile unui stream, rezultatul unui hash. Buffer este o subclasă a lui Uint8Array, deci merge oriunde se cere un Uint8Array.

Buffer.from("text") transformă textul în octeți UTF-8; buf.toString() face invers. Codificări utile: "utf8", "hex", "base64", "base64url", "latin1". Literele românești cu diacritice ocupă 2 octeți în UTF-8, de aceea Buffer.byteLength("ș") este 2, deși "ș".length este 1.

Buffer.alloc(n) creează un buffer de n octeți, plin cu zero. Buffer.concat lipește mai multe. subarray dă o porțiune care împarte memoria cu originalul (modificările se văd în ambele). new Buffer() este învechit: folosește Buffer.from sau Buffer.alloc.

Parametri

Parametru Descriere
Buffer.from(text, cod) Octeții textului în codificarea dată (implicit UTF-8).
Buffer.alloc(n) Buffer nou de n octeți, umplut cu 0.
Buffer.concat(listă) Un buffer nou din mai multe.
buf.toString(cod, start, sfârșit) Octeții transformați în text.
Buffer.byteLength(text) Câți octeți ocupă textul.
buf.equals(alt) / Buffer.compare(a, b) Compară conținutul.

Exemple

Exemplul 1: Text, octeți, hex și base64

const buf = Buffer.from("Iași");

console.log(buf);
console.log("caractere:", "Iași".length, "octeți:", buf.length);
console.log("hex:", buf.toString("hex"));
console.log("base64:", buf.toString("base64"));
console.log(Buffer.from("SWHImWk=", "base64").toString("utf8"));

Rezultat

<Buffer 49 61 c8 99 69>
caractere: 4 octeți: 5
hex: 4961c89969
base64: SWHImWk=
Iași

Exemplul 2: Bucăți lipite cu concat

Litera „ș” (octeții c8 99) a fost tăiată între două bucăți. Separat, bucățile dau caractere stricate; lipite, textul este corect.

const tot = Buffer.from("Brașov");
const parte1 = tot.subarray(0, 4);
const parte2 = tot.subarray(4);

console.log(parte1.toString() + parte2.toString());
console.log(Buffer.concat([parte1, parte2]).toString());

Rezultat

Bra��ov
Brașov

Exemplul 3: Octeți individuali și comparare

const antet = Buffer.alloc(4);
antet.writeUInt16BE(2026, 0);
antet[2] = 0xff;

console.log(antet, antet.readUInt16BE(0), antet[2]);
console.log(Buffer.from("abc").equals(Buffer.from("abc")));
console.log(Buffer.compare(Buffer.from("a"), Buffer.from("b")));

Rezultat

<Buffer 07 ea ff 00> 2026 255
true
-1

Greșeli frecvente

  • Verifici lungimea unui text pentru o limită în octeți (de exemplu o coloană din baza de date) cu text.length: diacriticele ocupă mai mult. Folosește Buffer.byteLength(text).
  • Folosești new Buffer(10): este învechit și, în versiunile vechi, putea conține date vechi din memorie. Scrie Buffer.alloc(10).
  • Modifici un subarray și te miri că s-a schimbat și originalul: împart aceeași memorie. Pentru o copie, folosește Buffer.from(buf).

Comenzi înrudite

  • stream.Readable: Stream-ul din care citești date bucată cu bucată: fișiere, cereri HTTP, stdin. Readable.from îl creează din orice iterabil.
  • crypto.createHash / createHmac: Calculează amprenta (hash) unui text sau fișier cu SHA-256 și semnături HMAC pentru verificarea mesajelor.
  • zlib (gzip, brotli): Comprimă și decomprimă date cu gzip, deflate sau Brotli: fișiere .gz, răspunsuri HTTP mai mici.
  • fs.readFile: Citește tot conținutul unui fișier: ca text dacă dai codificarea („utf8”), altfel ca Buffer cu octeții bruți.