Rumah >hujung hadapan web >tutorial js >Penjelasan terperinci tentang modul Penampan dalam NodeJS_node.js

Penjelasan terperinci tentang modul Penampan dalam NodeJS_node.js

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBasal
2016-05-16 16:21:341646semak imbas

1, analisis pembukaan

Penampan penimbal yang dipanggil bermaksud "kawasan storan sementara", iaitu bahagian memori yang menyimpan data input dan output buat sementara waktu.

Bahasa JS itu sendiri hanya mempunyai jenis data rentetan dan tiada jenis data binari, jadi NodeJS menyediakan Penimbal pembina global bersamaan dengan String untuk menyediakan operasi pada data binari. Selain membaca fail untuk mendapatkan contoh Penampan, ia juga boleh dibina secara langsung, contohnya:

Salin kod Kod adalah seperti berikut:

var penimbal = Penampan baharu([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]) ;
Penimbal adalah serupa dengan rentetan Selain menggunakan atribut .length untuk mendapatkan panjang bait, anda juga boleh menggunakan kaedah [indeks] untuk membaca bait pada kedudukan yang ditentukan, contohnya:

Salin kod Kod adalah seperti berikut:
penimbal[0] ; // 0x68;

Penimbal dan rentetan boleh ditukar kepada satu sama lain Contohnya, data binari boleh ditukar kepada rentetan menggunakan pengekodan yang ditentukan:

Salin kod Kod adalah seperti berikut:
var str = buffer.toString("utf-8"); // hello

Tukar rentetan kepada data binari dalam pengekodan yang ditentukan:

Salin kod Kod adalah seperti berikut:
var buffer= new Buffer("hello", "utf-8") ; //

Sedikit perbezaan:

Terdapat perbezaan penting antara Penampan dan rentetan. Rentetan adalah baca sahaja, dan sebarang pengubahsuaian pada rentetan menghasilkan rentetan baharu, manakala rentetan asal kekal tidak berubah.

Bagi Penampan, ia lebih seperti tatasusunan bahasa C yang boleh melakukan operasi penunjuk. Sebagai contoh, anda boleh menggunakan kaedah [indeks] untuk mengubah suai bait secara langsung pada kedudukan tertentu.

------------------------------------------------ --------------------------------------------------- --------------------------------------------------- --------------------------------------------------- --- --------------------------------

Kaedah

slice tidak mengembalikan Penampan baharu, sebaliknya mengembalikan penuding ke kedudukan di tengah Penampan asal, seperti ditunjukkan di bawah.

[ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]

                                                             |
bin bin.slice(2)
Oleh itu, pengubahsuaian kepada Penampan yang dikembalikan melalui kaedah hirisan akan menjejaskan Penampan asal, contohnya:

var buffer= Penampan baharu([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]) ;
var sub = bin.slice(2) ;
sub[0] = 0x65;
console.log(buffer); //


Jika anda ingin menyalin Penampan, anda mesti membuat Penampan baharu dahulu dan menyalin data dalam Penampan asal melalui kaedah .copy.

Ini sama seperti memohon memori baharu dan menyalin data dalam memori sedia ada. Di bawah adalah contoh.

var buffer= Penampan baharu([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]) ;
var dup = Penampan baharu(bin.length) ;
buffer.copy(dup) ;
dup[0] = 0x48 ;
console.log(buffer); //
console.log(dup) ; //

Ringkasnya, Penampan memanjangkan keupayaan pemprosesan data JS daripada rentetan kepada data binari arbitrari.

Di atas ialah pengenalan ringkas tentang apa itu Penampan Mari kita bincangkan tentang cara menggunakannya dan senario penggunaan khusus.

Dua, mari bercakap tentang Penampan

JavaScript sangat mesra pemprosesan rentetan sama ada bait lebar atau rentetan bait tunggal, ia dianggap sebagai rentetan. Node perlu memproses protokol rangkaian, mengendalikan pangkalan data, memproses gambar, muat naik fail, dsb. Ia juga perlu memproses sejumlah besar data binari Rentetan terbina dalam jauh daripada memenuhi keperluan ini, jadi Penimbal wujud.

Struktur penimbal

Penimbal ialah modul biasa yang menggabungkan Javascript dan C. Bahagian berkaitan prestasi dilaksanakan dalam C, dan bahagian bukan berkaitan prestasi dilaksanakan dalam JavaScript.

Node telah pun memuatkan Penampan ke dalam memori apabila proses bermula dan meletakkannya ke dalam objek global, jadi tidak perlu memerlukan

Objek penimbal: serupa dengan tatasusunan, elemennya ialah dua digit digit perenambelasan.

Peruntukan memori penimbal

Peruntukan memori objek Penampan tidak berada dalam memori timbunan V8 Aplikasi memori dilaksanakan pada tahap C Node.

Untuk menggunakan memori yang diminta dengan cekap, Node menggunakan mekanisme peruntukan papak ialah mekanisme pengurusan memori dinamik yang menggunakan pelbagai sistem pengendalian *nix. Papak mempunyai tiga keadaan:

(1) penuh: status diperuntukkan sepenuhnya

(2) separa: status peruntukan separa

(3) kosong: tiada status diberikan

Penukaran penimbal

Objek penimbal boleh ditukar kepada dan daripada rentetan Jenis pengekodan yang disokong adalah seperti berikut:

ASCII, UTF-8, UTF-16LE/UCS-2, Base64, Binary, Hex

Rentetan untuk Penampan

Penimbal baharu(str, [pengekodan]), lalai UTF-8
buf.write(rentetan, [offset], [panjang], [pengekodan])

Penimbal kepada rentetan

buf.toString([pengekodan], [mula], [tamat])

Jenis pengekodan tidak disokong oleh Penampan

Tentukan sama ada ia disokong oleh Buffer.isEncoding(encoding)

iconv-lite: Pelaksanaan JavaScript tulen, berat lebih ringan, prestasi lebih baik tanpa penukaran C kepada javascript

iconv: Panggil pustaka libiconv C untuk melengkapkan

Penyambungan penimbal

Beri perhatian kepada "res.on('data', function(chunk) {})". boleh dijana ,

Penyelesaian:

(1) Melalui kaedah setEncoding() dalam strim boleh dibaca, kaedah ini membenarkan peristiwa data dihantar bukan lagi sebagai objek Penampan, tetapi sebagai rentetan yang dikodkan, yang menggunakan modul StringEncoder secara dalaman.

(2) Simpan objek Penampan ke dalam tatasusunan buat sementara waktu, dan akhirnya pasangkannya ke dalam Penampan yang besar dan kemudian kodkannya ke dalam rentetan untuk output.

Penimbal digunakan secara meluas dalam fail I/O dan rangkaian I/O Prestasinya sangat penting, dan prestasinya jauh lebih tinggi daripada rentetan biasa.

Selain kehilangan prestasi dalam menukar rentetan, penggunaan Buffer mempunyai tetapan highWaterMark yang penting untuk prestasi semasa membaca fail.

a. Tetapan highWaterMark mempunyai kesan tertentu pada peruntukan dan penggunaan memori Penampan.

b. Menetapkan highWaterMark terlalu kecil boleh mengakibatkan terlalu banyak panggilan sistem.

Bila hendak menggunakan penimbal dan bila tidak menggunakannya ------ Javascript tulen menyokong kod unicode tetapi bukan binari Apabila berurusan dengan strim TCP atau strim fail, adalah perlu untuk memproses strim tersebut. utf-8, binari dan format lain, kita mesti menggunakan "Buffer".

3. Pengenalan contoh

Salin kod Kod adalah seperti berikut:

var buf = new Buffer("ini adalah ujian concat teks !") ,str = "ini ialah ujian concat teks ;
console.time("buffer concat test !");
senarai var = [] ;
var len = 100000 * buf.length ;
untuk(var i=0;i<100000;i ){
List.push(buf) ;
len = buf.length ;
}
var s1 = Buffer.concat(senarai, len).toString() ;
console.timeEnd("buffer concat test !") ;
console.time("string concat test !") ;
senarai var = [] ;
untuk (var i = 100000; i >= 0; i--) {
List.push(str) ;
}
var s2 = list.join("") ;
console.timeEnd("string concat test !") ;

Berikut ialah keputusannya:

Kelajuan membaca rentetan pasti lebih pantas, dan penimbal juga memerlukan operasi toString(). Oleh itu, apabila kita menyimpan rentetan, kita harus menggunakan rentetan atau rentetan Walaupun rentetan besar disambungkan ke dalam rentetan, kelajuan penyambungannya tidak akan lebih perlahan daripada penampan.

Jadi bila kita perlu menggunakan penimbal lagi? Apabila tidak ada cara lain, apabila kita menyimpan rentetan bukan utf-8, binari dan format lain, kita mesti menggunakannya.

Empat, ringkasan

(1), JavaScript sesuai untuk memproses data yang dikodkan Unicode, tetapi ia tidak mesra pemprosesan data binari.
(2), jadi apabila memproses aliran TCP atau sistem fail, adalah perlu untuk memproses aliran oktet.
(3), Node mempunyai beberapa kaedah untuk memproses, mencipta dan menggunakan aliran oktet.
(4) Data asal disimpan dalam contoh Penampan A adalah serupa dengan tatasusunan integer, tetapi memorinya diperuntukkan di luar tindanan V8. Saiz Penampan tidak boleh diubah.
(5), jenis pengekodan yang diproses ialah: ascii, utf8, utf16le, ucs2 (alias utf16le), base64, binari, hex.
(6), Penampan ialah elemen global, dan anda boleh mendapatkan contoh Penampan secara langsung dengan menggunakan Penampan baharu().

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn