Rumah  >  Artikel  >  hujung hadapan web  >  Penjelasan terperinci tentang menggunakan Penampan untuk mengekod dan menyahkod data binari dalam Node.js_node.js?1.1.2

Penjelasan terperinci tentang menggunakan Penampan untuk mengekod dan menyahkod data binari dalam Node.js_node.js?1.1.2

PHP中文网
PHP中文网asal
2016-05-16 16:39:401401semak imbas

JavaScript sangat baik dalam mengendalikan rentetan, tetapi kerana ia pada asalnya direka untuk mengendalikan dokumen HTML, ia tidak begitu baik untuk mengendalikan data binari. JavaScript tidak mempunyai jenis bait, tiada jenis berstruktur, malah tatasusunan bait, hanya nombor dan rentetan. (Teks asal: JavaScript tidak mempunyai jenis bait — ia hanya mempunyai nombor — atau jenis berstruktur, atau http://skylitecellars.com/ malah tatasusunan bait: Ia hanya mempunyai rentetan.)

Kerana Node ialah berdasarkan JavaScript , ia secara semula jadi boleh mengendalikan protokol teks seperti HTTP, tetapi anda juga boleh menggunakannya untuk berinteraksi dengan pangkalan data, mengendalikan muat naik imej atau fail, dll. Anda boleh bayangkan betapa sukarnya untuk melakukan perkara ini hanya menggunakan rentetan. Terdahulu, Node memproses data binari dengan mengekodkan bait ke dalam aksara teks, tetapi pendekatan ini kemudiannya terbukti tidak boleh dilaksanakan, membazir sumber, perlahan, tidak fleksibel dan sukar untuk dikekalkan.

Node mempunyai Penimbal pelaksanaan penimbal binari ini menyediakan satu siri API untuk memproses data binari, memudahkan tugas yang memerlukan pemprosesan data binari. Panjang penimbal ditentukan oleh panjang data bait, dan anda boleh menetapkan dan mendapatkan data bait secara rawak dalam penimbal.

Nota: Terdapat perkara istimewa tentang kelas Buffer Memori yang diduduki oleh data bait dalam penimbal tidak diperuntukkan pada JavaScrp

Timbunan memori VM, yang bermaksud objek ini. tidak akan Diproses oleh algoritma kutipan sampah JavaScript, ia digantikan dengan alamat memori kekal yang tidak akan diubah suai, yang juga mengelakkan pembaziran CPU yang disebabkan oleh penyalinan memori kandungan penimbal.

Mencipta penimbal

Anda boleh mencipta penimbal daripada rentetan UTF-8, seperti ini:

Kodnya adalah seperti berikut :

var buf = new Buffer(‘Hello World!');


Anda juga boleh membuat penimbal dengan rentetan pengekodan yang ditentukan:

Kodnya adalah seperti berikut:

var buf = new Buffer('8b76fde713ce', 'base64');

Pengekodan dan pengecam aksara yang boleh diterima adalah seperti berikut:

1.ascii - ASCI, hanya terpakai pada set aksara ASCII.
2.utf8 - UTF-8, pengekodan lebar boleh ubah ini sesuai untuk mana-mana aksara dalam set aksara Unicode Ia telah menjadi pengekodan pilihan dalam dunia Web dan juga merupakan jenis pengekodan lalai Node.
3.base64——Base64, pengekodan ini berdasarkan 64 aksara ASCII yang boleh dicetak untuk mewakili data binari Base64 biasanya digunakan untuk membenamkan data binari dalam dokumen aksara yang boleh ditukar kepada rentetan dan lengkap apabila diperlukan kepada format binari asal.

Jika tiada data untuk memulakan penimbal, anda boleh mencipta penimbal kosong dengan kapasiti yang ditentukan:

Kodnya adalah seperti berikut:

var buf = new Buffer(1024); // 创建一个1024字节的缓冲

Dapatkan dan tetapkan data penimbal

Selepas mencipta atau menerima objek penimbal, anda mungkin mahu melihat atau mengubah suai kandungannya Anda boleh mengakses bait tertentu penimbal melalui pengendali []. :

Kodnya adalah seperti berikut:

var buf = new Buffer('my buffer content');
// 访问缓冲内第10个字节
console.log(buf[10]); // -> 99

Nota: Apabila anda mencipta penimbal yang dimulakan (menggunakan saiz kapasiti penimbal), pastikan anda ambil perhatian bahawa data penimbal ialah tidak dimulakan kepada 0. Tetapi data rawak.

Kod adalah seperti berikut:

var buf = new Buffer(1024);
console.log(buf[100]); // -> 5 (某个随机值)

Anda boleh mengubah suai data pada mana-mana kedudukan dalam penimbal seperti ini:

Kod adalah seperti berikut:

buf[99] = 125; // 把第100个字节的值设置为125

Nota: Dalam sesetengah kes, beberapa operasi penimbal tidak akan menyebabkan ralat, seperti:

1 Nilai maksimum bait dalam penimbal ialah 255. Jika a bait diberikan nilai yang lebih besar daripada 256 Nombor tersebut akan menjadi modulo 256 dan hasilnya akan diberikan kepada bait ini.
2. Jika bait tertentu dalam penimbal diberikan nilai 256, nilai sebenarnya ialah 0 (Nota Penterjemah: Sebenarnya diulang dengan yang pertama, 256%6=0)
3 nombor titik terapung memberikan nilai kepada bait tertentu dalam penimbal, seperti 100.7 Nilai sebenar akan menjadi bahagian integer nombor titik terapung - 100
4 Jika anda cuba menetapkan nilai ke lokasi yang melebihi kapasiti penimbal, operasi penugasan akan gagal.

Anda boleh menggunakan atribut length untuk mendapatkan panjang penimbal:

Kodnya adalah seperti berikut:

var buf = new Buffer(100);
console.log(buf.length); // -> 100

Anda juga boleh menggunakan penimbal panjang untuk mengulang kandungan penimbal untuk dibaca Atau tetapkan setiap bait:

Kod adalah seperti berikut:

var buf = new Buffer(100);
for(var i = 0; i < buf.length; i++) {
    buf[i] = i;
}

Kod di atas mencipta penimbal baharu yang mengandungi 100 bait dan menetapkan kandungan penimbal daripada 0 hingga 99 setiap bait.

Pisah data penimbal

Setelah penimbal dibuat atau diterima, anda mungkin perlu mengekstrak sebahagian daripada data penimbal Anda boleh memisahkan data penimbal sedia ada dengan menentukan kedudukan permulaan, dengan itu mencipta penimbal lain yang lebih kecil:

Kod adalah seperti berikut:

var buffer = new Buffer("this is the content of my buffer");
var smallerBuffer = buffer.slice(8, 19);
console.log(smallerBuffer.toString()); // -> "the content"

Perhatikan bahawa apabila membelah penimbal, tiada memori baharu diperuntukkan atau Salin , penimbal baharu menggunakan memori penimbal induk, yang hanya merujuk kepada sekeping data tertentu (dinyatakan oleh kedudukan permulaan) penimbal induk. Petikan ini mengandungi beberapa makna.

Pertama sekali, jika program anda mengubah suai kandungan penimbal induk, pengubahsuaian ini juga akan mempengaruhi penimbal anak yang berkaitan, kerana penimbal induk dan penimbal anak adalah objek JavaScript yang berbeza, jadi mudah diabaikan masalah ini dan menyebabkan beberapa Potensi pepijat.

Kedua, apabila anda mencipta penimbal anak yang lebih kecil daripada penimbal induk dengan cara ini, objek penimbal induk masih akan dikekalkan selepas operasi selesai dan tidak akan menjadi sampah jika anda tidak memberi perhatian , Mudah menyebabkan kebocoran ingatan.

注意:如果你担心因此产生内存泄露问题,你可以使用copy方法来替代slice操作,下面将会介绍copy。

复制缓冲数据

你可以像这样用copy将缓冲的一部分复制到另外一个缓冲:

 代码如下:

var buffer1 = new Buffer("this is the content of my buffer");
var buffer2 = new Buffer(11);
var targetStart = 0;
var sourceStart = 8;
var sourceEnd = 19;
buffer1.copy(buffer2, targetStart, sourceStart, sourceEnd);
console.log(buffer2.toString()); // -> "the content"

上面代码,复制源缓冲的第9到20个字节到目标缓冲的开始位置。

解码缓冲数据

缓冲数据可以这样转换成一个UTF-8字符串:

代码如下:

var str = buf.toString();

还可以通过指定编码类型来将缓冲数据解码成任何编码类型的数据。比如,你想把一个缓冲解码成base64字符串,可以这么做:

 代码如下:

var b64Str = buf.toString("base64");

使用toString函数,你还可以把一个UTF-8字符串转码成base64字符串:

代码如下:

var utf8String = &#39;my string&#39;;
var buf = new Buffer(utf8String);
var base64String = buf.toString(&#39;base64&#39;)

小结

有时候,你不得不跟二进制数据打交道,但是原生JavaScript又没有明确的方式来做这件事,于是Node提供了Buffer类,封装了一些针对连续内存块的操作。你可以在两个缓冲之间切分或复制内存数据。

你也可以把一个缓冲转换成某种编码的字符串,或者反过来,把一个字符串转化成缓冲,来访问或处理每个bit。

以上就是Node.js中使用Buffer编码、解码二进制数据详解_node.js?1.1.2的内容,更多相关内容请关注PHP中文网(www.php.cn)!


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