Bir arabellek, ham bellekteki belirli bir konumdur. İşlem biriminin o anda kabul edemediği fazla ikili veriler için geçici bir depolama alanı görevi görür.
Node.js bir Buffer sınıfı içerir. Bir dosya sisteminde TCP (Aktarım Kontrol Protokolü) akışlarını ve okuma-yazma işlemlerini yönetirken ikili verilerle ilgilenebilir.
Arabellek içeriğini nasıl oluşturacağınızı, okuyacağınızı ve değiştireceğinizi öğrenin.
Tampon Oluşturma
Node.js'de bir Tampon oluşturmak için, ayırma() veya itibaren() yöntemler. bu ayırma() yöntemi, oluşturma sırasında boyutunu ilk ve tek gerekli parametre olarak belirterek yeni bir arabellek oluşturur. Tampon oluşturma sırasında saklayacak veriniz olmadığında kullanışlıdır.
İle bir arabellek oluşturduğunuzda, arabellek boyutu parametresini bayt cinsinden belirtin. ayırma() yöntem. Örneğin:
sabit tampon = Buffer.alloc(8);
konsol.log (buf);
// çıktı:
Buffer sınıfı, ile oluşturduğunuzda yeni veriler için yer tutucu değerler olarak otomatik olarak sıfırlar ekler. ayırma() yöntem.
Buffer sınıfı, her 0 değerini şu şekilde ifade eder: 00, onaltılık biçimi kullanarak. Bu örnekte, toplam sekiz değer içerir.
Tamponu farklı yer tutucu değerlerle başlatmak için bir saniye geçirin doldurmak parametre:
sabit buf_filled = Tampon.alloc(8, 5);
konsol.log (buf_filled);
// çıktı:
Bu nesne, değerin 8 baytını depolayan bellekteki bir bölümden alıntı yapar. 05. Numara olarak bir sayı iletmiş olmanıza rağmen, doldurmak parametre, arabellekler verileri yalnızca ikili olarak depolar.
Buffer'a bellek tahsis ettikten sonra, yazmak() yöntem:
sabit tampon = Buffer.alloc(8);
buf.write("v", "utf-8");
konsol.log (buf)
// çıktı:
buf.write("va","utf-8");
konsol.log (buf)
// çıktı:
bu yazmak() yöntemi kullanarak ilk parametreyi dönüştürmek için karakter kodlamasını kullanır. utf-8 ve sonra dizeyi Tampon'a yazar. Dizeye ikinci bir karakter eklemek, ikinci baytı dolduracaktır.
Dizeler veya diziler gibi mevcut veri türlerinden veri ayıklamak için itibaren() yöntem. Bu yöntem, dizelerden ve dizilerden arabellekler oluşturur.
Örneğin:
// Sicim
sabit stringBuf = Buffer.from('sicim')
konsol.log (stringBuf)
// çıktı:
// Sıralamak
sabit arrayBuf = Buffer.from([97, 114, 114, 97, 121], "altıgen")
konsol.log (diziBuf);
// çıktı:
bu itibaren() yöntemi, girişi ilk parametresi olarak alır, verileri kodlamak için ihtiyaç duyduğu bayt sayısını hesaplar ve ardından sonucu Tampon'a gönderir. İkinci parametre olarak başka bir kodlama formatı sağlayarak, varsayılan kodlamayı (UTF-8) geçersiz kılabilirsiniz.
Numaraları iletmek itibaren() yöntem hata verecektir.
Tampon Okuma
Tamponlar dizilere benzese de yeniden boyutlandırılamazlar ve ikili bilgisayar verileri yerleşik yöntemler sayesinde.
Buffer sınıfı, JavaScript'in köşeli parantez sözdizimini kullanarak verilerinin baytlarını tek tek okumamıza izin verir.
Örneğin:
sabit myBuf = Buffer.from('Bana ait');
konsol.kayıt(MyBuf[1]);
// çıktı: 105konsol.kayıt(MyBuf[3]);
// çıktı: 101
konsol.kayıt(MyBuf[5]);
// çıktı: tanımsız
Yukarıdaki kod bloğu, ondalık gösterimlerinde birinci ve üçüncü baytların değerlerini elde etmek için köşeli parantez sözdizimini kullanır. Geçersiz bir bayt almaya çalışmak, Tanımsız hata.
Tüm verilerine erişmek için Buffer sınıfı, yöntemlerle birlikte gelir. toJSON() Ve toString(), içeriği iki farklı biçimde elde eden.
bu toString() yöntem, arabellek içeriği olarak bir dize çıkarır:
sabit myBuf = Buffer.from('Bana ait');
konsol.kayıt(benimBuf'um.toString());
// çıktı: 'Benim'sabit sayıBuf = Buffer.from([123]);
konsol.kayıt(sayıBuf.toString())
// çıktı: '{'
sabit emptyBuf = Tampon.alloc(5);
konsol.kayıt(boşBuf.toString());
// çıktı: '\\x00\\x00\\x00\\x00\\x00'
İlk çağrı, Tamponu “değeriyle başlatır.Bana ait”, toString çağrısının çoğaldığı. İkinci örnek, başlatma için " olarak bir dize temsiline sahip tek bir int dizisi kullanır.{” karakter. Son durumda, beşli bir Tampon boş değerler " dizesini döndürür\x00\x00\x00\x00\x00”. dize \x00 null'un onaltılık gösterimidir.
bu toString() Yöntem, Arabellek'i ne tür verilerle başlatırsanız başlatın, sonucu her zaman dize biçiminde verir.
bu .toJSON() yöntemi, Tamponu başlatmak için kullandığınız verilerden bağımsız olarak, Tampon verilerinin ondalık gösterimini döndürür.
Örneğin:
sabit myBuf = Buffer.from('Bana ait');
konsol.kayıt(benimBuf'um.toJSON());
// çıktı: { tip: 'Tampon', veri: [ 77, 105, 110, 101 ] }
JSON çıktısının bir tip değeri olan özellik Tampon kökenini belirtmek için. Data özelliği, orijinal bayt dizisini temsil eden bir ondalık sayı dizisini depolar.
Bir Tamponu Değiştirmek
Bir Tamponun ayrı baytlarına erişmeye benzer şekilde, köşeli parantez sözdizimini kullanarak bir Tampon içeriğinin tek tek baytlarını da değiştirebilirsiniz.
Tek bir içeriği değiştirmek için köşeli parantez sözdizimini kullanırken, değerin yalnızca ondalık gösterimini atayabilirsiniz.
Örneğin:
myBuf[0] = 70
konsol.kayıt(benimBuf'um.toString())
// çıktı: 'İyi'
Arabellekler ikili veriler olduğundan, arabelleğin belirli bir bölümüne bir dize veremezsiniz. Bir dizgeye ayrı bir bayt ayarlamaya çalışırsanız, Buffer onu boş bir karaktere çevirir.
Örneğin:
benimBuf'um[0] = 'F';
konsol.kayıt(benimBuf'um.toString());
// çıktı: '\\x00ine'
Alternatif olarak, bir arabelleğin tüm içeriğini aşağıdakileri kullanarak değiştirebilirsiniz: yazmak() yöntem.
Tampon uzunluğunun dışında bir dizin eklemeyi düşünün. Buffer, bir hata döndürmek yerine geçersiz dizini yok sayar ve orijinal Buffer içeriğini olduğu gibi tutar.
Örneğin, beşinci öğeyi ayarlamayı deneyin. benimBuf'um ile R ondalık gösterimi aracılığıyla 114:
myBuf[4] = 114;
konsol.kayıt(benimBuf'um.toString());
// çıktı: 'Benim'
Dikkat edin toString() yöntem aynı değeri döndürür 'Bana ait'.
Bir Tamponu yeniden boyutlandıramayacağınız için, birden fazla veri yazmaya çalışmak fazladan verileri atmasına neden olur. Örneğin:
sabit buf1 = Tampon.alloc(5)
buf1.write('sayı');
konsol.kayıt(buf1.toString())
// çıktı: 'sayı'
Kullanmak toString() arabellek verilerini doğrulama yöntemi, döndürür "uyuşmuş" ziyade 'sayı'. içine eklenen bağımsız değişken hangisidir? yazmak() yöntem.
Arabellekler, dizin sıfırdan başlayarak seri biçimde yazar. bu yazmak() yöntem seri olarak baytları bir Tampon'a ekler ve önceki verilerin üzerine yazar.
Örneğin:
sabit buf2 = Tampon.alloc(6);
buf2.write('üye');
konsol.kayıt(buf2.toString())
// çıktı: 'üye'
buf2.write('MERHABA');
konsol.kayıt(buf2.toString());
// çıktı: 'himber'
Yukarıdaki kod altı baytlık bir arabellek oluşturur ve " dizesini ekler.üye" kullanarak ona yazmak() yöntem.
Daha sonra arabelleği önceki içeriğe göre daha az bellek alanı kaplayan yeni içerikle günceller.
Bu, ilk iki baytın üzerine yazıldığı ve kalan baytların değiştirilmeden bırakıldığı yeni bir dizenin oluşturulmasıyla sonuçlanır.
Birçok API ve Veri Yapısı Tamponları Kullanır
Artık bir arabellek oluşturmayı, bir ara belleğe yazmayı, içeriğini okumayı ve uygun yöntemlerle değiştirmeyi biliyorsunuz.
Node.js Buffer sınıfıyla çalışmak için kullanılabilecek birkaç başka yöntem vardır.
Akışlar ve dosya sistemleri gibi farklı kavramların nasıl çalıştığını anlamak için bu yöntemleri bilmeli ve Tamponları anlamalısınız.