Node.js'de arabellekleri işleme

JavaScript Dizeleri iyi işleyen bir dildir, ancak başlangıçta HTML belgelerini işlemek için tasarlandığından, ikili verileri işlemede pek iyi değildir, aslında JavaScript'in ikili veri türü yoktur, yalnızca yapılandırılmış sayılar içerir veya türleri.

zaten bildiğimiz gibi Node.js dayanır JavaScript ve HTTP gibi metin protokollerini işleyebilir, burada veritabanları ile iletişim kurmak, görüntüleri işlemek ve hatta dosya manipülasyonunu işlemek için de kullanabilirsiniz ve tartıştığımız şey nedeniyle bunu sadece dizelerle yapmak oldukça karmaşık olabilir.

Ancak bu ikili manipülasyon görevlerini çok daha kolay hale getirmek için, Node.js oluşturulan bir arabelleğin baytlarını çok fazla sorun yaşamadan elde etmemize ve ayarlamamıza izin veren bir ikili arabellek uygulaması içerir.

GereksinimlerBu eğitimde önerilen alıştırmaları gerçekleştirmek için işlevsel bir kuruluma sahip olmalıyız. Node.js sistemimizde, araştırmaya devam etmeden önce bu eğiticiye bir göz atabiliriz. Örnekleri kodlamak için zengin bir metin düzenleyiciye erişebilmek de önemlidir, rahat hissettiğimiz her şeyi kullanabiliriz, ancak kullanım kolaylığı için öneririz. Yüce metin o Sözdizimi için eklentileri de olan NotePad ++ JavaScript Y HTML.

arabellek oluşturma


Bir arabellek oluşturmak, sınıfın yeni bir örneğini oluşturmak kadar basittir. Tampon(). UTF-8 kodlamasına dayalı basit bir tamponu aşağıdaki gibi nasıl oluşturduğumuzu görelim:
 var buf = new Buffer ('Merhaba dünya!'); konsol.log (tampon);
Bize verdiği cevabı görmek için örneğimizi konsoldan yürüteceğiz. Node.js Tamponumuzun oluşturulmasıyla ilgili olarak:

Gördüğümüz gibi değişkenimizi yazdırırsak devetüyü rengi, cevap beklediğimiz gibi olmayabilir, ancak bir örneğini oluşturduğumuzu hatırlamalıyız. Tampon ve bu sınıfın yaptığı, içeriğini belirli karakter kodlamasına göre kodlamaktır.

Ayrıca, ikinci argümanla aynı şeyi belirttiğimiz sürece geçerli olacak diğer kodlamalarla bir dize arabelleği de oluşturabiliriz, görelim:

 var buf2 = yeni Tampon ('9b38kte610la', 'base64'); konsol.log (buf2);
Gördüğümüz gibi kodlamayı sorunsuz bir şekilde belirleyebiliriz, o zaman ne tür kodlamaların kabul edildiğini ve ilgili tanımlayıcılarını görelim:

ascii - ASCIIBu standart kodlama türüdür ve aynı adı taşıyan karakter kodlaması ile sınırlıdır.
utf8 - UTF-8Bu, mevcut her Unicode karakterini temsil edebilen kodlamaya sahip bir değişkendir ve bu, herhangi birinin belirtilmemesi durumunda arabelleğimizin varsayılan kodlamasıdır.
base64 - Base64Bu, ikili verileri bir tür dize biçiminde temsil etmek için kullanılan bir kodlama türüdür. ASCII ve çoğunlukla, verilerin aktarımında bozulmadan kalmasını sağlamak için ikili verileri metin belgelerine gömmek için kullanılır.
Ek olarak, eğer tamponumuz için başlangıç ​​içeriğimiz yoksa ve bir tane oluşturmamız gerekiyorsa, kapasitesini belirterek bunu yapabiliriz, bunun için aşağıdaki şekilde yaparız:

 var buf = yeni Tampon (1024);
Bununla, gelecekteki operasyonlarımız için 1024 baytlık bir tampon oluşturuyoruz.

Tampondaki baytların işlenmesi


Tamponu oluşturduktan veya aldıktan sonra, onu incelemek ve içeriğini değiştirmek isteyebiliriz. İlk olarak, içindeki baytlara erişmek için parantezleri aşağıdaki gibi kullanabiliriz:
 var buf = new Buffer ('arabelleğimin içeriği burada'); konsol.log (tampon [10]);
Örneğimizi çalıştırırsak, tamponun onuncu konumunu alacağız, hatta tamponun dokuzuncu konumuna geçebiliriz ve sonucu görebiliriz, bakalım nasıl görünüyor:

Gördüğümüz gibi, arabelleğimizin konumları için rastgele baytlar elde ediyoruz, içindeki herhangi bir konumun içeriğini değiştirmemiz gerekse bile, aşağıdaki gibi bir şey yapabiliriz:

 var buf = new Buffer ('yeni tamponumun içeriği burada'); buf [2] = 110; buf [6] = 180; tampon [10] = 90; konsol.log (tampon [2]); konsol.log (tampon [6]); konsol.log (tampon [10]);
Örneğimizin konsol yanıtını görelim:

Gördüğümüz gibi, arabelleğimizdeki belirli konumların içeriğini çok fazla sorun yaşamadan değiştirebiliriz, buna ek olarak, özellik ile arabelleğimizin boyutunu elde edebiliriz. uzunluk aşağıdaki gibi:

 var buf = yeni Tampon (100); konsol.log (tampon uzunluk);
Gözlemciysek, konsolumuzun yanıtının 100 olacağını görebiliriz, burada bu değeri elde ettikten sonra, onu tamponumuz üzerinde yinelemek için kullanabilir ve böylece değerini elde etmek veya belirli bir değer ayarlamak için her konumu manipüle edebiliriz. buna basit bir örnek:
 var buf = new Buffer (100); for (var i = 0; i <buf.uzunluk; i ++) {buf [i] = i; } konsol.log (tampon);
Bu örnekte yaptığımız şey, yeni bir tampon 100 bayt kapasiteli ve ardından her baytı 0'dan 99'a kadar bir değerle ayarlıyoruz, son olarak örneğimizi çalıştırdığımızda konsolun tepkisini görelim:

Tampon veri çıkarma


Tamponun bir başka ilginç özelliği, onu oluşturduğumuzda veya aldığımızda, bir kısmını çıkarabilmektir. Bunu bir şekilde söylemek için "kesebiliriz" ve kestiğimiz kısımla, nereden ve nereye keseceğimizi belirtmeyi unutmadan daha küçük bir tampon daha oluşturabiliriz, açıkladığımızı göstermek için bir örnek görelim:
 var buffer_complete = new Buffer ("bu, keseceğimiz arabelleğimin içeriğidir"); var buffer_small = full_buffer.slice (26, 55); konsol.log (buffer_small.toString());
Gördüğümüz gibi, önce tamponumuzun örneğini ilk içerikle, ardından fonksiyonla oluşturuyoruz. dilim () İçeriği nereden ve nereden alacağımızı belirliyoruz, elde ettiğimizi yeni bir değişkene atadık ve son olarak ikinci tamponumuzun içeriğini görselleştirebilmek için içeriğin kodunu çözüyoruz, çalıştırırken konsoldan gelen yanıtı görelim. örnek:

Yeni bir arabellek kestiğimizde yeni sistem belleği kullanmadığımızı belirtmek önemlidir, bu yeni arabellek babanın belleğini kullanır, çünkü yalnızca ona atıfta bulunur, ancak farklı bir başlangıç ​​ve sonla. Aynı tampon üzerinde çalıştığımız için dikkatli olmazsak bu bazı sorunlara neden olabilir, bunun için metotla çalışmanızı öneririz. kopyalamak Aşağıda göreceğimiz sorunları önlemek için.

Bir arabellek kopyalama


Bahsettiğimiz gibi, bir tampon keserken dikkatli olmazsak bazı problemlerle karşılaşabiliriz, ancak bunun için yöntemimiz var. kopyalamakYeni bir örnek ve yeni bir bellek alanı kullanarak bir arabelleğin içeriğini yeni bir arabelleğe kopyalamamıza izin veren , görelim:
 var buffer1 = new Buffer ("İçerik arabelleği numarası 1, kopyalanacak içerik"); var buffer2 = new Buffer (20); var startobj = 0; var startSource = 26; var sourceEnd = 50; buffer1.copy (buffer2, startobj, startSource, endSource); konsol.log (buffer2.toString());
Gördüğümüz gibi iki farklı tampon oluşturuyoruz, birincisi içeriğe, ikincisi ise sadece boyuta sahip olacak, ikinci tamponumuz için başlangıcı belirliyoruz ve aynı şekilde başlangıç ​​ve bitişi de belirtiyoruz. kopyalayacağımız yeni tampon, örneği çalıştırırken konsolun yanıtını görelim:

Bir arabellek kodunu çözme


Önceki örneklerde gördüğümüz gibi, yöntemi kullanarak arabelleğimizin orijinal içeriğini yazdırabildik. toString (), buna arabelleğin kodunu çözmek denir, burada sınıfın örneği gibi Tampon() herhangi bir şey belirtmezsek, varsayılan olarak kodunu çözeriz UTF-8.

Hatta bir dizgenin kod çevrimini bile yapabiliriz UTF-8 ile base64 bir vakadan bahsetmek gerekirse, görelim:

 var stringutf8 = 'yeni dizim'; var buf = yeni Tampon (stringutf8); var base64string = buf.toString ('base64') console.log (base64string);
Son olarak orijinal dizgimizi nasıl dönüştürdüğümüze bakalım:

Bununla, ikili verilerle başa çıkmanın yollarını öğrendiğimiz bu öğreticiyi bitiriyoruz. Node.js sınıf sayesinde TamponBu, okuma, yazma, küçük parçalarını elde etme, yeni örneklere kopyalama ve hatta bu arabelleği programlarımızda manipülasyonu için yeni kodlama türlerine dönüştürmemize izin verir.

wave wave wave wave wave