Javascript bagus dalam menangani string, tetapi karena awalnya dirancang untuk menangani dokumen HTML, tidak terlalu bagus dalam menangani data biner. JavaScript tidak memiliki tipe byte, tidak ada tipe terstruktur, dan bahkan tidak ada array byte, hanya angka dan string. (Teks asli: JavaScript tidak memiliki tipe byte - hanya memiliki angka - atau tipe terstruktur, atau http://skylitecellars.com/ bahkan array byte: hanya memiliki string.)
Karena Node didasarkan pada JavaScript, secara alami dapat menangani protokol teks seperti HTTP, tetapi Anda juga dapat menggunakannya untuk berinteraksi dengan database, memproses gambar atau unggahan file, dll. Dapat dibayangkan betapa sulitnya melakukan hal -hal ini hanya dengan string. Sebelumnya, node menangani data biner dengan encoding byte ke dalam karakter teks, tetapi metode ini kemudian terbukti tidak layak, membuang -buang sumber daya, lambat, tidak fleksibel, dan sulit dipertahankan.
Node memiliki buffer implementasi buffer biner. Kelas semu ini menyediakan serangkaian API untuk memproses data biner, menyederhanakan tugas yang memerlukan pemrosesan data biner. Panjang buffer ditentukan oleh panjang data byte, dan Anda dapat mengatur secara acak dan mendapatkan data byte dalam buffer.
Catatan: Kelas buffer memiliki tempat khusus. Memori yang ditempati oleh data byte dalam buffer tidak dialokasikan dalam javascrp.
Ini tumpukan memori VM, yaitu, objek -objek ini tidak akan diproses oleh algoritma pengumpulan sampah Javascript, dan akan digantikan oleh alamat memori permanen yang tidak akan dimodifikasi, yang juga menghindari limbah CPU yang disebabkan oleh penyalinan memori dari konten buffer.
Buat buffer
Anda dapat membuat buffer dengan string UTF-8 seperti ini:
Salinan kode adalah sebagai berikut:
var buf = buffer baru ('halo dunia!');
Anda juga dapat membuat buffer dengan penyandian yang ditentukan:
Salinan kode adalah sebagai berikut:
var buf = buffer baru ('8b76fde713ce', 'base64');
Pengkodean dan identifikasi karakter yang dapat diterima adalah sebagai berikut:
1.Asci-ASCI, hanya berlaku untuk set karakter ASCII.
2.UTF8-UTF-8, pengkodean lebar variabel ini cocok untuk karakter apa pun dalam set karakter Unicode. Ini telah menjadi penyandian yang disukai di dunia web dan juga jenis node penyandian default.
3.Base64 - Base64, pengkodean ini didasarkan pada 64 karakter ASCII yang dapat dicetak untuk mewakili data biner. BASE64 biasanya digunakan untuk menanamkan data biner yang dapat dikonversi menjadi string dalam dokumen karakter, dan dapat dikonversi kembali ke format biner asli utuh dan tanpa loss tanpa dibutuhkan.
Jika tidak ada data untuk menginisialisasi buffer, Anda dapat membuat buffer kosong dengan ukuran kapasitas yang ditentukan:
Salinan kode adalah sebagai berikut:
var buf = buffer baru (1024); // Buat buffer 1024-byte
Dapat dan setel data buffered
Setelah membuat atau menerima objek buffered, Anda mungkin ingin melihat atau memodifikasi isinya. Anda dapat mengakses byte buffer tertentu melalui operator []:
Salinan kode adalah sebagai berikut:
var buf = buffer baru ('konten buffer saya');
// Akses byte ke -10 di buffer
console.log (buf [10]); // -> 99
Catatan: Saat Anda membuat buffer yang diinisialisasi (menggunakan ukuran kapasitas buffer), pastikan untuk mencatat bahwa data buffer tidak diinisialisasi ke 0, tetapi merupakan data acak.
Salinan kode adalah sebagai berikut:
var buf = buffer baru (1024);
console.log (buf [100]); // -> 5 (beberapa nilai acak)
Anda dapat memodifikasi data di mana saja di buffer seperti ini:
Salinan kode adalah sebagai berikut:
buf [99] = 125; // Atur nilai byte ke -100 ke 125
Catatan: Dalam beberapa kasus, beberapa operasi buffering tidak menghasilkan kesalahan, seperti:
1. Nilai maksimum byte dalam buffer adalah 255. Jika byte diberi angka lebih besar dari 256, itu akan dimodulasi dengan 256 dan kemudian menetapkan hasilnya untuk byte ini.
2. Jika byte buffered ditugaskan ke 256, nilai sebenarnya akan 0 (Catatan Penerjemah: Ini sebenarnya diulangi dengan yang pertama, 256%256 = 0)
3. Jika Anda menggunakan nomor titik mengambang untuk menetapkan nilai ke byte dalam buffer, seperti 100.7, nilai aktual akan menjadi bagian integer dari nomor titik mengambang - 100
4. Jika Anda mencoba menetapkan nilai ke posisi yang melebihi kapasitas buffer, operasi penugasan akan gagal dan buffer tidak akan dimodifikasi.
Anda dapat menggunakan atribut panjang untuk mendapatkan panjang buffer:
Salinan kode adalah sebagai berikut:
var buf = buffer baru (100);
console.log (buf.length); // -> 100
Anda juga dapat mengulangi konten buffer menggunakan panjang buffer untuk membaca atau mengatur setiap byte:
Salinan kode adalah sebagai berikut:
var buf = buffer baru (100);
untuk (var i = 0; i <buf.length; i ++) {
buf [i] = i;
}
Kode di atas membuat buffer baru yang berisi 100 byte dan mengatur setiap byte dalam buffer dari 0 hingga 99.
Iris Data Buffered
Setelah buffer dibuat atau diterima, Anda mungkin perlu mengekstrak sebagian dari data buffered. Anda dapat membagi buffer yang ada dengan menentukan posisi awal untuk membuat buffer kecil lainnya:
Salinan kode adalah sebagai berikut:
var buffer = buffer baru ("Ini adalah konten buffer saya");
var loowsbuffer = buffer.slice (8, 19);
console.log (SmallyBuffer.tostring ()); // -> "Konten"
Perhatikan bahwa saat membagi buffer, tidak ada memori baru yang dialokasikan atau disalin. Buffer baru menggunakan memori buffer induk, yang hanya merupakan referensi ke bagian data tertentu (ditentukan oleh posisi awal). Bagian ini memiliki beberapa makna.
Pertama, jika program Anda memodifikasi isi buffer induk, modifikasi ini juga akan mempengaruhi buffer anak yang relevan, karena buffer induk dan buffer anak adalah objek JavaScript yang berbeda, sehingga mudah untuk mengabaikan masalah ini dan menyebabkan beberapa bug potensial.
Kedua, ketika Anda membuat buffer anak yang lebih kecil dari buffer induk dengan cara ini, objek buffer induk masih akan disimpan setelah operasi selesai dan tidak akan dikumpulkan sampah. Jika Anda tidak hati -hati, itu akan dengan mudah menyebabkan kebocoran memori.
Catatan: Jika Anda khawatir tentang kebocoran memori, Anda dapat menggunakan metode salin alih -alih operasi irisan. Berikut ini akan memperkenalkan salinan.
Salin data buffered
Anda dapat menggunakan salinan untuk menyalin sebagian buffer ke buffer lain seperti ini:
Salinan kode adalah sebagai berikut:
var buffer1 = buffer baru ("Ini adalah konten buffer saya");
var buffer2 = buffer baru (11);
var targetStart = 0;
var sourcestart = 8;
var sourceend = 19;
buffer1.copy (buffer2, targetstart, sourcestart, sourceEnd);
console.log (buffer2.tostring ()); // -> "Konten"
Dalam kode di atas, salin byte 9 hingga 20 dari buffer sumber ke posisi awal buffer target.
Decode data buffered
Data buffer dapat dikonversi menjadi string UTF-8 seperti ini:
Salinan kode adalah sebagai berikut:
var str = buf.tostring ();
Data buffered juga dapat diterjemahkan ke data jenis pengkodean apa pun dengan menentukan tipe pengkodean. Misalnya, jika Anda ingin memecahkan kode buffer menjadi string base64, Anda dapat melakukan ini:
Salinan kode adalah sebagai berikut:
var b64str = buf.tostring ("base64");
Menggunakan fungsi ToString, Anda juga dapat mentranskode string UTF-8 ke string Base64:
Salinan kode adalah sebagai berikut:
var utf8string = 'my string';
var buf = buffer baru (utf8string);
var base64string = buf.tostring ('base64')
ringkasan
Kadang -kadang Anda harus berurusan dengan data biner, tetapi JavaScript asli tidak memiliki cara yang jelas untuk melakukan ini, jadi Node menyediakan kelas buffer yang merangkum beberapa operasi untuk blok memori kontinu. Anda dapat membagi atau menyalin data memori antara dua buffer.
Anda juga dapat mengubah buffer menjadi semacam string yang dikodekan, atau pada gilirannya, mengubah string menjadi buffer untuk mengakses atau memproses setiap bit.