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'de Tamponları Anlamak

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 alloc() veya from() yöntemlerini kullanacaksınız. alloc() 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.

alloc() yöntemiyle bir arabellek oluşturduğunuzda, arabellek boyutu parametresini bayt cinsinden belirtin . Örneğin:

const buf = Buffer.alloc(8);

console.log(buf);

// output: <Buffer 00 00 00 00 00 00 00 00>

Buffer sınıfı, alloc() yöntemiyle oluşturduğunuzda yeni veriler için yer tutucu değerler olarak otomatik olarak sıfırlar ekler .

Buffer sınıfı , onaltılık biçim kullanarak her 0 değerini 00 olarak ifade eder. Bu örnekte, toplam sekiz değer içerir.

Tamponu farklı yer tutucu değerlerle başlatmak için ikinci bir fill parametresi iletin:

const buf_filled = Buffer.alloc(8, 5);

console.log(buf_filled);

// output: <Buffer 05 05 05 05 05 05 05 05>

Bu nesne, bellekte 05 değerinin 8 baytını saklayan bir bölümü aktarır . Doldurma parametresi olarak bir sayı iletmiş olmanıza rağmen arabelleklerin verileri yalnızca ikili dosyada sakladığını unutmayın.

Buffer’a bellek ayırdıktan sonra, write() yöntemini çağırarak veri yazın:

const buf = Buffer.alloc(8);

buf.write(“v”, “utf-8”);

console.log(buf)

// output: <Buffer 76 00 00 00 00 00 00 00>

buf.write(“va”,”utf-8″);

console.log(buf)

// output: <Buffer 76 61 00 00 00 00 00 00>

write() yöntemi , utf-8’i kullanarak ilk parametreyi dönüştürmek için karakter kodlamasını kullanır ve ardından dizeyi Buffer’a yazar. Dizeye ikinci bir karakter eklemek, ikinci baytı dolduracaktır.

Dizeler veya diziler gibi mevcut veri türlerinden veri ayıklamak için from() yöntemini kullanın. Bu yöntem, dizelerden ve dizilerden arabellekler oluşturur.

Örneğin:

// String

const stringBuf = Buffer.from(‘string’)

console.log(stringBuf)

// output: <Buffer 73 74 72 69 6e 67>

// Array

const arrayBuf = Buffer.from([97, 114, 114, 97, 121], ‘hex’)

console.log(arrayBuf);

// output: <Buffer 61 72 72 61 79>

from() 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.

from() yöntemine sayıların iletilmesi bir hataya neden olur.

Tampon Okuma

Tamponlar dizilere benzese de yeniden boyutlandırılamazlar ve yerleşik yöntemler sayesinde ikili bilgisayar verileriyle başa çıkabilirler.

Buffer sınıfı, JavaScript’in köşeli parantez sözdizimini kullanarak verilerinin baytlarını tek tek okumamıza izin verir.

Örneğin:

const myBuf = Buffer.from(‘Mine’);

console.log(MyBuf[1]);

// output: 105

console.log(MyBuf[3]);

// output: 101

console.log(MyBuf[5]);

// output: undefined

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 bir hataya neden olur.

Tüm verilerine erişmek için Buffer sınıfı , içeriği iki farklı biçimde alan toJSON() ve toString() yöntemleriyle gelir.

toString() yöntemi , arabellek içeriği olarak bir dize verir:

const myBuf = Buffer.from(‘Mine’);

console.log(myBuf.toString());

// output: ‘Mine’

const numberBuf = Buffer.from([123]);

console.log(numberBuf.toString())

// output: ‘{‘

const emptyBuf = Buffer.alloc(5);

console.log(emptyBuf.toString());

// output: ‘\x00\x00\x00\x00\x00’

İlk çağrı , ToString çağrısının çoğalttığı “ Mine ” değeriyle Tamponu başlatır . İkinci örnek, başlatma için ” { ” karakteri olarak bir dize temsiline sahip tek bir int dizisi kullanır. Son durumda, beş boş değere sahip bir Tampon ” x00x00x00x00x00 ” dizesini döndürür . x00 dizesi , null’un onaltılık gösterimidir.

toString() yöntemi , Buffer’ı ne tür verilerle başlatmış olursanız olun, sonucu her zaman dize biçiminde verir.

.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:

const myBuf = Buffer.from(‘Mine’);

console.log(myBuf.toJSON());

// output: { type: ‘Buffer’, data: [ 77, 105, 110, 101 ] }

JSON çıktısı, kaynağını belirtmek için Buffer değerine sahip bir type özelliğine sahiptir. Data özelliği, orijinal bayt dizisini temsil eden bir ondalık sayı dizisini depolar.

Bir Tamponu Değiştirmek

Bir Tampon’un 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

console.log(myBuf.toString())

// output: ‘Fine’

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:

myBuf[0] = ‘F’;

console.log(myBuf.toString());

// output: ‘\x00ine’

Alternatif olarak, write() yöntemini kullanarak bir tamponun tüm içeriğini değiştirebilirsiniz .

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, myBuf’un beşinci öğesini 114’ün ondalık gösterimi aracılığıyla r olarak ayarlamayı deneyin :

myBuf[4] = 114;

console.log(myBuf.toString());

// output: ‘Mine’

toString() yönteminin aynı ‘Mine’ değerini döndürdüğüne dikkat edin .

Bir Tamponu yeniden boyutlandıramayacağınız için, birden fazla veri yazmaya çalışmak fazladan verileri atmasına neden olur. Örneğin:

const buf1 = Buffer.alloc(5)

buf1.write(‘number’);

console.log(buf1.toString())

// output: ‘numbe’

Tampon verilerini doğrulamak için toString() yöntemini kullanarak, “number ” yerine “number” değerini döndürür. write() yönteminin içine eklenen bağımsız değişken hangisidir ?

Arabellekler, dizin sıfırdan başlayarak seri biçimde yazar. write() yöntemi , önceki verilerin üzerine yazarak seri olarak baytları bir Tampon’a ekler.

Örneğin:

const buf2 = Buffer.alloc(6);

buf2.write(‘member’);

console.log(buf2.toString())

// output: ‘member’

buf2.write(‘hi’);

console.log(buf2.toString());

// output: ‘himber’

Yukarıdaki kod altı baytlık bir arabellek oluşturur ve write() yöntemini kullanarak ” üye” dizesini buna ekler.

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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir