Buffer adalah kelas Node untuk menyimpan urutan byte dengan panjang tetap. Kelas ini menjadi jembatan antara data biner yang diproses oleh modul inti seperti fs dan stream dengan string dan JSON yang biasa diolah pada kode aplikasi. Buffer adalah subkelas dari Uint8Array, sehingga seluruh metode TypedArray dapat dipakai, dengan tambahan metode khusus untuk konversi string dan encoding. Setelah membaca topik ini, pembaca dapat membuat Buffer dari string maupun larik byte, membaca byte per byte, mengonversi antar encoding, serta memahami hubungannya dengan Uint8Array.
Membuat Buffer#
Cara paling lazim membuat Buffer adalah Buffer.from(string, encoding), yang mengubah string menjadi urutan byte menurut encoding yang diberikan. Encoding standar adalah utf8, dan panjang hasil dalam byte tidak selalu sama dengan jumlah karakter karena karakter di luar ASCII memerlukan lebih dari satu byte. Selain itu, Buffer.from(array) menerima larik bilangan bulat antara 0 dan 255, sedangkan Buffer.alloc(size) membuat Buffer kosong dengan panjang tertentu yang sudah diisi nol. Konstruktor Buffer() lama sudah usang karena masalah keamanan dan tidak boleh dipakai.
const buf = Buffer.from('halo, dunia', 'utf8');
console.log('isi:', buf.toString('utf8'));
console.log('panjang byte:', buf.length);
console.log('byte ke-0:', buf[0]);
console.log('byte ke-0 heksa:', buf[0].toString(16));
console.log('heksa lengkap:', buf.toString('hex'));
const gabungan = Buffer.concat([
Buffer.from('satu '),
Buffer.from('dua '),
Buffer.from('tiga')
]);
console.log('gabungan:', gabungan.toString());isi: halo, dunia
panjang byte: 11
byte ke-0: 104
byte ke-0 heksa: 68
heksa lengkap: 68616c6f2c2064756e6961
gabungan: satu dua tigaAkses buf[0] mengembalikan bilangan bulat, yaitu nilai byte pada indeks tersebut, sehingga buf[0] untuk huruf h adalah 104 (kode ASCII). Pemanggilan .toString(16) pada angka tersebut menghasilkan representasi heksadesimal 68, dan buf.toString('hex') mengembalikan seluruh byte sebagai string heksadesimal. Fungsi Buffer.concat menggabungkan beberapa Buffer menjadi satu, dan berguna saat merakit potongan yang diterima dari stream menjadi kesatuan sebelum diproses.
Encoding dan konversi#
Buffer mendukung beberapa encoding: utf8 untuk teks, hex untuk representasi heksadesimal, base64 untuk pengkodean biner-ke-teks, dan latin1 untuk byte tunggal. Metode Buffer.from(string, encoding) mengubah string menjadi byte, sedangkan buf.toString(encoding) mengembalikan string menurut encoding yang diminta. Pemakaian base64 berguna untuk menyimpan data biner pada media yang hanya menerima teks, dan pemakaian hex berguna untuk menampilkan byte secara kompak pada log.
const teks = 'kue';
console.log('utf8:', Buffer.from(teks, 'utf8').toString('hex'));
console.log('base64:', Buffer.from(teks, 'utf8').toString('base64'));
const dariB64 = Buffer.from('a3Vl', 'base64');
console.log('dari base64:', dariB64.toString('utf8'));
const buf = Buffer.from([72, 97, 108, 111]);
console.log('dari array byte:', buf.toString('utf8'));
console.log('representasi buffer:', buf);utf8: 6b7565
base64: a3Vl
dari base64: kue
dari array byte: Halo
representasi buffer: <Buffer 48 61 6c 6f>Tiga byte 6b 75 65 merepresentasikan tiga huruf k, u, dan e dalam UTF-8 karena seluruhnya berada dalam rentang ASCII. Konversi base64 menghasilkan a3Vl, dan konversi balik dari a3Vl mengembalikan kue, sehingga siklus lengkap. Pemanggilan console.log(buf) pada Buffer mencetak representasi <Buffer 48 61 6c 6f> yang menampilkan byte dalam heksadesimal, yang berguna untuk memeriksa isi buffer ketika debugging.
Buffer sebagai Uint8Array#
Buffer adalah subkelas dari Uint8Array, sehingga metode seperti subarray, slice, set, dan fill dapat dipakai. Metode subarray(start, end) mengembalikan tampilan ke bagian Buffer asli tanpa menyalin memori, sehingga perubahan pada tampilan memengaruhi Buffer asli. Metode slice berperilaku serupa tetapi mengembalikan Buffer baru. Pemakaian subarray lebih hemat memori ketika hanya diperlukan referensi ke bagian data.
Karena Buffer adalah Uint8Array, objek ini juga dapat dipakai pada API web standar seperti TextEncoder dan TextDecoder, meskipun Node sudah menyediakan metode string bawaan. Pada modul fs, operasi readFile tanpa opsi encoding mengembalikan Buffer, dan pemrosesan lebih lanjut seperti pemisahan baris atau penguraian JSON biasanya memerlukan konversi ke string terlebih dahulu. Pemahaman hubungan Buffer dan Uint8Array membantu saat berpindah antara kode Node dan kode peramban yang memakai Uint8Array murni.
Alokasi dan kumpulan memori#
Node mengelola memori Buffer melalui kumpulan (pool) internal berukuran tetap untuk efisiensi. Fungsi Buffer.alloc(size) mengembalikan Buffer yang sudah diisi nol, sehingga aman digunakan tanpa khawatir data lama dari alokasi sebelumnya terbaca. Fungsi Buffer.allocUnsafe(size) mengembalikan Buffer tanpa pengisian nol, yang lebih cepat tetapi dapat berisi data sisa dari alokasi sebelumnya. Buffer.allocUnsafe hanya boleh dipakai ketika seluruh byte akan ditulis sebelum dibaca, misalnya pada jalur kode kinerja tinggi di stream internal Node.
Untuk menulis dan membaca bilangan bertipe tertentu pada posisi byte tertentu, Buffer menyediakan metode keluarga writeUInt8, readUInt8, writeUInt16BE, readUInt16LE, dan seterusnya untuk berbagai lebar dan endianness. Akhiran BE dan LE masing-masing menandakan big-endian dan little-endian. Pemakaian metode ini berguna saat membaca format biner yang memiliki tata letak byte tetap, seperti header berkas atau paket protokol. Tata letak yang dibaca pada satu mesin harus ditulis dengan endianness yang sama agar hasilnya konsisten.
Kesalahan umum#
Pemakaian new Buffer(string) yang sudah usang masih dijumpai pada kode lama dan memicu peringatan keamanan karena konstruktor ini tidak membersihkan memori sebelumnya. Pengganti yang aman adalah Buffer.from(string) atau Buffer.alloc(size). Kesalahan lain adalah mengira buf.length menghitung karakter, padahal nilainya adalah jumlah byte, yang berbeda untuk karakter di luar ASCII pada UTF-8. Pemrosesan string seperti String.prototype.length atau regex tetap perlu dilakukan pada string hasil buf.toString('utf8'), bukan pada Buffer mentah.
Modifikasi Buffer hasil subarray tanpa menyadari bahwa memori dibagi juga sering memicu bug. Ketika tampilan diubah, Buffer asli ikut berubah karena keduanya menunjuk ke memori yang sama. Untuk memperoleh salinan independen, gunakan Buffer.from(buf.subarray(start, end)) agar salinan dibuat.
Ringkasan#
Buffer.from(string, encoding)membuatBufferdari string UTF-8,Buffer.alloc(size)membuatBufferkosong berisi nol, danBuffer.concatmenggabungkan beberapaBuffer.buf[i]mengembalikan nilai byte sebagai bilangan bulat,buf.lengthmenghitung byte bukan karakter, danbuf.toString('hex'|'base64'|'utf8')mengonversi ke representasi lain.Bufferadalah subkelasUint8Array, sehinggasubarray,slice,set, danfilldapat dipakai, dengansubarrayberbagi memori denganBufferasli.- Hindari konstruktor
new Buffer()usang dan hindari mengirabuf.lengthsebagai jumlah karakter.
Referensi#
- Buffer — Node.js
— Referensi resmi kelas
Bufferdengan rincianBuffer.from,Buffer.alloc,Buffer.concat, dan daftar encoding. - Buffer and TypedArray — Node.js
— Penjelasan resmi tentang hubungan
BufferdenganUint8ArraydanTypedArray.