Rumah  >  Artikel  >  hujung hadapan web  >  Ketahui lebih lanjut tentang Penampan dalam Node

Ketahui lebih lanjut tentang Penampan dalam Node

青灯夜游
青灯夜游ke hadapan
2023-04-25 19:49:112302semak imbas

Ketahui lebih lanjut tentang Penampan dalam Node

Di penghujung bab Strim, kita ditinggalkan dengan soalan, apakah keluaran ketulan oleh kod berikut?

Ketahui lebih lanjut tentang Penampan dalam Node

Dengan mencetak, kita dapati bongkah ialah objek Penampan, unsur-unsurnya ialah nombor dua digit heksadesimal, iaitu nilai dari 0 hingga 255. [Tutorial berkaitan yang disyorkan: tutorial video nodejs, Pengajaran pengaturcaraan]

Untitled 1.png

Ini bermakna data yang mengalir dalam Strim ialah Penampan, kemudian Mari terokai wajah sebenar Penampan!

? Mengapa Penimbal diperkenalkan dalam Node?

Pada mulanya, JS hanya dijalankan pada rentetan yang dikodkan Unikod adalah mudah untuk diproses, tetapi untuk binari Kesukaran mengendalikan rentetan dengan pengekodan bukan Unikod. Dan binari ialah format data peringkat terendah komputer Video/audio/program/paket rangkaian semuanya disimpan dalam binari. Jadi Node perlu memperkenalkan objek untuk mengendalikan binari, jadi Buffer dilahirkan, yang digunakan untuk sistem aliran/fail TCP dan operasi lain untuk memproses bait binari.

Memandangkan Buffer terlalu biasa digunakan dalam Node, Buffer telah diperkenalkan apabila Node bermula, tanpa menggunakan require()

Apakah itu ArrayBuffer

ArrayBuffer ialah sekeping data binari dalam ingatan Ia tidak boleh mengendalikan memori itu sendiri. Ia perlu dikendalikan melalui objek TypeArray atau DataView. Wakilkan data dalam penimbal ke dalam format tertentu, dan baca serta tulis kandungan penimbal melalui format ini Ia menggunakan antara muka tatasusunan dan boleh menggunakan tatasusunan untuk mengendalikan data

paparan TypedArray

Paling biasa digunakan ialah paparan TypeArray, yang digunakan untuk membaca dan menulis jenis ArrayBuffer yang ringkas, seperti paparan tatasusunan Uint8Array (integer 8-bit tidak ditandatangani), paparan tatasusunan Int16Array (integer 16-bit)

Hubungan dengan Penampan

Kelas Penampan dalam NodeJS sebenarnya adalah pelaksanaan Uint8Array.

Struktur penampan

Penimbal ialah objek seperti Array, tetapi ia digunakan terutamanya untuk mengendalikan bait

Struktur modul

Penimbal ialah gabungan JS dan C++ Modul, bahagian prestasi semuanya dilaksanakan dalam C++, dan bahagian bukan prestasi semuanya dilaksanakan dalam JS

Untitled 2.png

Memori yang diduduki oleh Penampan tidak diperuntukkan oleh V8 dan tergolong dalam timbunan luar ingatan.

Struktur objek

Objek penimbal adalah serupa dengan tatasusunan, elemennya ialah nombor dua digit perenambelasan, iaitu nilai dari 0 hingga 255

Untitled 3.png

Dapat dilihat daripada contoh ini bahawa aksara yang berbeza menduduki bait yang berbeza dalam Pengekodan Di bawah UTF-8, aksara Cina menduduki 3 bait dan simbol bahasa Inggeris dan separuh lebar menduduki 1 bait

? Apakah yang akan berlaku jika elemen input ialah nombor perpuluhan/negatif/melebihi 255?

Untitled 4.pngUntuk situasi di atas, pemprosesan Penampan ialah:

Jika nilai yang diberikan kepada elemen kurang daripada 0, nilai akan diberikan satu persatu Tambah 256 sehingga anda mendapat integer antara 0 dan 255
  • Jika nilai lebih besar daripada 255, tolak 256 satu demi satu sehingga anda mendapat nilai antara 0 dan 255
  • Jika ia perpuluhan, Hanya bahagian integer dikekalkan
Mengapa Penimbal memaparkan heksadesimal

Sebenarnya, nombor binari masih disimpan dalam memori, tetapi Penimbal memaparkan memori ini Data menggunakan penimbal

heksadesimal dengan saiz 2 bait, dengan jumlah 16 bit, seperti

untuk memaparkannya secara langsung, tukarkannya kepada heksadesimal

00000001 00100011<buffer></buffer>Penciptaan Penampan

Penimbal.alloc dan Penampan.allocUnsafe

Penciptaan penimbal saiz tetap

Buffer.alloc(size [, fill [, encoding]])

  • size Panjang penimbal baharu yang diingini
  • isi Nilai yang digunakan untuk praisi Penimbal baharu. Lalai: 0
  • pengekodan Jika isi ialah rentetan, ini ialah pengekodan aksaranya. Nilai lalai: utf8

Untitled 5.png

Buffer.allocUnsafe(size)

Alokasikan Penampan bait saiz, allocUnsafe dilaksanakan lebih cepat daripada alloc , kami mendapati bahawa keputusan tidak dimulakan kepada 00 seperti Buffer.alloc Segmen memori yang diperuntukkan mungkin mengandungi data lama. Jika anda tidak menulis ganti data lama ini semasa digunakan, ia boleh menyebabkan kebocoran memori Walaupun ia pantas, cuba elakkan daripada menggunakannya Modul Penampan akan memperuntukkan contoh Buffer dalaman dengan saiz Buffer.poolSize sebagai peruntukan cepat. . Kumpulan memori, digunakan untuk mencipta kejadian Buffer baharu menggunakan allocUnsafe

Buffer.fromUntitled 6.png

Buat Buffer terus berdasarkan kandungan

Buffer.from(string [, pengekodan] )

Buffer.from(array)

Buffer.from(buffer)

  • Buffer.allocUnsafe memory mechanism
  • Untuk menggunakan memori yang digunakan dengan cekap, Node.js mengguna pakai mekanisme papak untuk pra-aplikasi dan pasca-peruntukan Ia merupakan mekanisme pengurusan dinamik

Gunakan Buffer.alloc(saiz). untuk lulus dalam Saiz yang ditentukan akan digunakan untuk kawasan memori saiz tetap Papak mempunyai tiga keadaan berikut: Untitled 7.png

penuh: keadaan diperuntukkan sepenuhnya

separa: keadaan diperuntukkan separa.

kosong: Tiada status diperuntukkan

  • Node.js menggunakan 8 KB sebagai had untuk membezakan objek kecil daripada objek besar
Penimbal Saiz ditentukan apabila dibuat dan tidak boleh dilaraskan!

Peruntukkan objek kecilUntitled 8.png

Jika objek yang diperuntukkan kurang daripada 8KB, Node akan memperuntukkannya sebagai objek kecil

Penimbal digunakan terutamanya dalam proses peruntukan. Kolam pembolehubah tempatan berfungsi sebagai objek pemprosesan perantaraan, dan semua unit papak dalam keadaan yang diperuntukkan menghala kepadanya. Berikut ialah operasi memperuntukkan unit papak serba baharu, yang akan menghalakan objek SlowBuffer yang baru digunakan kepadanya

unit papak

Untitled 9.pngPeruntukkan Penampan 2KB

Selepas mencipta penimbal 2KB, memori unit papak adalah seperti berikut:

Untitled 10.png

Proses peruntukan ini dilakukan dengan memperuntukkan Penyempurnaan kaedah

Untitled 11.pngSelepas kami mencipta penimbal 2KB, status papak semasa adalah separa

Apabila kami mencipta penimbal semula, kami akan menilai semasa baki papak Adakah terdapat cukup ruang? Jika sudah mencukupi, gunakan ruang yang tinggal dan kemas kini status peruntukan papak

Jika ruang papak tidak mencukupi, papak baru akan dibina, dan ruang yang tinggal dalam papak asal akan terbuangUntitled 12.png

Peruntukkan objek besar

Jika terdapat penimbal melebihi 8KB, anda akan pergi terus ke fungsi creatUnsafeBuffer dan memperuntukkan unit papak ini akan diduduki secara eksklusif oleh objek Penampan besar ini

mekanisme peruntukan peruntukan adalah seperti yang ditunjukkan dalam rajah

Mekanisme peruntukan memori Penampan

Untitled 13.pngPengekodan penampan dan aksara

Dengan menggunakan pengekodan aksara, Buffer tika dan Penukaran antara rentetan JavaScript

Untitled 14.png

Node kini menyokong lapan kaedah pengekodan: utf8, ucs2, utf16le, latin1, ascii, base64, hex dan base64Url Pelaksanaan terperinci

Untitled 16.png

. Untuk setiap skim pengekodan yang berbeza, satu siri API akan dilaksanakan dan hasil yang berbeza akan dikembalikan Node.js akan mengembalikan objek yang berbeza mengikut pengekodan masuk

Penimbal dan penukaran rentetan

Tukar. rentetan kepada Buffer

terutamanya melalui kaedah Buffer.from yang dinyatakan di atas Kaedah pengekodan lalai ialah utf-8

Buffer kepada rentetan

Untitled 17.png

? Mengapakah watak bercelaru muncul? Bagaimana untuk menyelesaikan masalah ini?

Dari segi bacaan, panjang setiap bacaan ialah 4, dan keluaran ketulan adalah seperti berikut

Untitled 18.png

bersamaan dengan

Dalam data += chunkdata = data.toString + chunk.toString

memandangkan satu aksara Cina menduduki tiga bait, bait keempat dalam bongkah pertama akan memaparkan aksara berantakan, dan bait pertama dan kedua bagi bongkah kedua tidak boleh membentuk teks, jadi kod bercelaru masalah akan dipaparkan

Untuk lebih banyak pengetahuan berkaitan nod, sila lawati:

tutorial nodejs!

Atas ialah kandungan terperinci Ketahui lebih lanjut tentang Penampan dalam Node. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam