Node.js'te Tampon Alan (Buffer) Kullanımı

Node.js'te Tampon Alan (Buffer) Kullanımı

JavaScript, unicode ile barışık olmasına rağmen, ikili (binary) veriyi işlemekte çok iyi özellikler göstermez. Oysa TCP akımları (streams) söz konusu olduğunda ya da dosyalardan bilgi okuma ya da dosyalara bilgi yazma yapılacaksa, saf ikili verilerle işlem yapmak zorunludur.
Node.js, sekizli akımlarını (octet streams) kullanma, oluşturma ve işleme konusunda çeşitli stratejilere sahiptir. Bir sekizli, 0-255 arasında onluk sistemdeki sayıları temsil etmek için kullanılabilir. Ham veri, Buffer sınıfının örnekleri içinde saklanır. Böylece ham ve saf ikili veriyi işleme olanağı oluşur.
Sekizli, hesaplama ve telekomünikasyon alanlarında kullanılan bir sayısal (dijital) bilgi birimidir; bir sekizli, 8 bitten oluşur. 8 bitlik bilgi de genellikle 1 byte olarak isimlendirilir. Tampon alan ya da buffer, bilgisayar belleğinde fiziksel bir bölgedir. Veri, belleğin bir yerinden diğerine aktarılırken, geçici olarak burada saklanır.
Node.js'te buffer bir tamsayı dizisi gibi çalışır; ancak yeniden boyut verilemez. Buffer sınıfı, globaldir; ikili (binary) veriyi doğrudan işleme olanağı sağlar.

Node.js'te Buffer Oluşturma

Buffer oluşturmak için çeşitli yöntemler mevcuttur.

new Buffer(n)

new Buffer(n) ifadesi, n adet sekizliden oluşan bir yeni buffer oluşturur. Burada n, sayı türündedir.

Argümanlar

AdAnlamıTipi
nBuffer'ın boyutuSayı (number)

Örnek


> var tampon=new Buffer(12);
undefined
>

new Buffer(dizi)

new Buffer() fonksiyonu, bir sekizli dizisi kullanarak yeni bir buffer oluşturur.

Argümanlar

AdAnlamıTipi
DiziVerilen bir diziDizi

Örnek


> var tamp = new Buffer([4,15,89,56,34,13]);
undefined
> console.log(tamp);
<Buffer 04 0f 59 38 22 0d>
undefined
>

Verilerin on altılık (hexadecimal) olarak listelendiğine dikkat edin. On altılık veri, aslında ikili sistemde (binary) veridir. Hatırlatma yaparsak, on altılık bir veri, ikilik sisteme doğrudan on altılık karakterlerin, ikilik karşılıklarını yerleştirerek dönüştürülür:
OnlukOn altılık (Hexadecimal)OnlukOn altılık
0088
1199
2210A
3311B
4412C
5513D
6614E
7715F
(5AE)16=(010110101110)2

new Buffer(string, [kodlama])

new Buffer(string,[kodlama]) fonksiyonu, verilen bir stringi içeren yeni bir buffer oluşturmak için kullanılır.

Argümanlar

AdAnlamıZorunlu / İsteğe bağlıTipi
StringVerilen stringZorunluString
KodlamaKullanılan kodlama yöntemi UTF8 öntanımlıdır.İsteğe bağlıString

Örnek


> var kod=new Buffer("Turkcell Gelecegi Yazanlar");
undefined
> console.log(kod);
<Buffer 54 75 72 6b 63 65 6c 6c 20 47 65 6c 65 63 65 67 69 20 59 61 7a 61 6e 6c 61 72>
undefined
>

Buffer.isEncoding (kodlama) fonksiyonu

isEncoding() metodu, bir kodlama zincirinin geçerli bir kodlama tipinde olup olmadığını kontrol eder.

Argümanlar

AdAnlamıTipi
KodlamaKodlama TipiString

Örnek


> console.log(Buffer.isEncoding('utf8'));
true
undefined
> console.log(Buffer.isEncoding('ascii'));
true
undefined
> console.log(Buffer.isEncoding('binary'));
true
undefined
> console.log(Buffer.isEncoding('base64'));
true
undefined
> console.log(Buffer.isEncoding('base32'));
false
undefined

Buffer'a Yazma İşlemi

buf.write() metodu, buffer'a bir string yazmak için kullanılır:
AdAçıklamaZorunlu / İsteğe bağlıTip
StringYazılacak stringZorunluString
OffsetYazmanın başlayacağı yeri belirleyen bir indis değeridir. Öntanımlı değer 0'dır.İsteğe bağlıSayı
UzunlukYazılacak stringin uzunluğudur. Öntanımlı değer, "buffer.length-offset" şeklindedir.İsteğe bağlıSayı
KodlamaKullanılan kodlama sistemini belirtir. Öntanımlı değer UTF8'dir.İsteğe bağlıString

Örnek


> var buf = new Buffer(12);
undefined
> buf.write("bilgisayar bilimi","utf8");
12
12 byte yazılmıştır.

> buf.write(" harikadir",10,"utf8");
2
>
10. byte'tan itibaren 2 byte yazılmıştır.

Buffer'dan Okuma İşlemi

buf.toString([kodlama], [başlangıç], [son])

buf.toString() metodu, ikili olarak kodlanmış veriyi çözer ve buffer'daki veriyi okuyarak bir stringe yükler.

Argümanlar

AdAçıklamaZorunlu / İsteğe bağlıTip
KodlamaKodlama sistemi. Öntanımlı değer UTF8.İsteğe bağlıString
BaşlangıçOkumanın başlayacağı yer. Öntanımlı değer 0.İsteğe bağlıSayı
SonOkumanın sona ereceği yer. Öntanımlı değer, "buffer.length"İsteğe bağlıSayı

Örnek


> var buf = new Buffer(15);
undefined
> buf.write("TURKIYE","utf8");
7
> buf.toString("utf8",0,5);
'TURKI'
> buf.toString("utf8",0);
'TURKIYE\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000'
> buf.toString("utf8");
'TURKIYE\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000'

JSON ile temsil: buf.toJSON()

buf.toJSON() metodu, buffer örneğinin JSON şeklinde temsilini gerçekleştirmek için kullanılır. JSON dizileriyle aynı yapıdadır.

Örnek


> var baf = new Buffer(8);
undefined
> baf.write("istanbul");
8
> baf.toJSON(baf);
[ 105,
  115,
  116,
  97,
  110,
  98,
  117,
  108 ]

Tek bir sekizli atama

buf[indis] fonksiyonuyla belirtilen indis konumuna bir sekizli atanabilir veya buradan okuma yapılabilir. Erişilen değerler byte türündendir ve değer aralığı, 0x00 ile 0xFF (hexadecimal - on altılık) ya da 0-255 (decimal - onluk) arasındadır.

Örnek


> var string1=new Buffer(20);
undefined
> string1.write("uzun sicak bir yaz");
18
> console.log(string1[0]);
117
undefined
> console.log(string1[1]);
122
undefined
> console.log(string1[18]);
67
undefined
> string1[4]='*'.charCodeAt();
42
> string1[10]='*'.charCodeAt();
42
> string1.toString();
'uzun*sicak*bir yazC\u000b'
>
Kolayca anlaşıldığı gibi charCodeAt() fonksiyonu, belirtilen karakteri (burada '*') belirtilen pozisyona yerleştiriyor.

Bir Nesnenin Buffer Olup Olmadığını Kontrol Etme

Buffer.isBuffer(nesne) metodu

Buffer.isBuffer(nesne) metodu, belirtilen nesnenin, Node.js'te bir buffer olup olmadığını kontrol eder. Döndürülen değer, kontrol edilen nesne buffer ise true, aksi takdirde false'tur.

Örnek


> var string1 = new Buffer(20);
'uzun*sicak*bir yazC\u000b'
> Buffer.isBuffer(string1);
true
> var ds = 89;
undefined
> Buffer.isBuffer(ds);
false
);


Bir String'in Gerçek Uzunluğu

Buffer.byteLength(string, [kodlama]) metodu

Buffer.byteLength(string, [kodlama]) metodu, verilen bir kodlama sistemine göre saklandığında, string'in alacağı gerçek uzunluk miktarını verir.

Argümanlar

AdTanımZorunlu / İsteğe bağlıTip
StringVerilen bir stringZorunluString
SBir kodlama sistemi. UTF8 ön tanımlıdır.İsteğe bağlıString

Örnek

> var sar="Turkcell Gelecegi Yazanlar";
undefined
> console.log(Buffer.byteLength(sar,"utf8"));
26
undefined
> console.log(Buffer.byteLength(sar,"base64"));
19
undefined
> console.log(Buffer.byteLength(sar,"ascii"));
26

İki Buffer'ı Birbirine Ekleme

Buffer.concat(liste, [toplamuzunluk]) metodu

Buffer.concat() metodu, iki ya da daha fazla buffer'ı ya da string'i birbirine eklemek için kullanılır.

Argümanlar

AdAçıklamaZorunlu / İsteğe bağlıTip
listeEklenecek buffer elemanlarının listesiZorunluDizi
toplamuzunlukBuffer elemanlarının eklendikten sonraki toplam uzunluğuİsteğe bağlıSayı
Buffer.concat fonksiyonunun gönderdiği değer bir bufferdır.
  • Listede hiç eleman yoksa ya da toplam uzunluk parametresi 0 ise, gönderilen değer 0 uzunluklu bir buffer'dır.
  • Listede sadece bir tane eleman varsa, listedeki ilk eleman gönderilir.
  • Listede birden fazla eleman varsa, yeni bir buffer oluşturulur.
  • Toplam uzunluk verilmemişse, listedeki buffer'lara göre belirlenir. Öte yandan bu, ilave işlem demektir. Eğer hız önemli ise, toplam uzunluk belirtilmelidir.

Örnek

> var a = new Buffer("merhaba");
undefined
> var b = new Buffer(" istanbul");
undefined
> var c = Buffer.concat([a,b],16);
undefined
> c.toString();
'merhaba istanbul'
> var d = Buffer.concat([c,a,b],32);
undefined
> d.toString();
'merhaba istanbulmerhaba istanbul'

Buffer Uzunluğu

Buf.length metodu

Buf.length metodu, bir buffer'ın uzunluğunu byte cinsinden bulur. Böylece, ne kadar bellek kullanıldığı konusunda bir fikir sahibi olunur. Bu değer, buffer'ın içeriğiyle aynı uzunlukta olmayabilir. Genellikle bir buffer'ın üçte biri doldurulur.

> var buf1 = new  Buffer(20);
undefined
> buf1.write("viyana");
6
> buf1.length
20
>

Bir Buffer'ı Parçalama

Buf.slice([basla],[son])

Buf.slice() metodu, bir buffer'ın alt parçası ya da parçalarını oluşturmak için kullanılır.

Argümanlar

AdAçıklamaZorunlu / İsteğe bağlıTip
baslaBuffer'da başlangıç pozisyonu. Öntanımlı 0.İsteğe bağlıSayı
sonBufferda son pozisyon (alt parça için). Öntanımlı değer, buffer.lengthİsteğe bağlıSayı
Negatif indis, buffer'ın sonundan itibaren başlanacak demektir.

Örnek

> var buf = new Buffer("abcdefgh");
undefined
> buf.toString();
'abcdefgh'
> buf.slice(3,6);
<Buffer 64 65 66>
> buf.slice(3,6).toString();
'def'
>

abcdefgh
12345678

Bir Buffer'ın Kopyasını Oluşturma

buf.copy(hedefBuffer, [hedefBasla], [kaynakBasla], [kaynakSon]) metodu

buf.copy() metodu, bir buffer'ın içeriğini, diğer bir buffer içine kopyalamak amacıyla kullanılır.

Argümanlar

AdAçıklamaZorunlu / İsteğe bağlıTip
hedefBufferİçine kopyanın aktarılacağı bufferZorunluBuffer nesnesi
hederBaslaHedef buffer'daki başlangıç noktası. Öntanımlı değer 0.İsteğe bağlıSayı
kaynakBaslaKaynak buffer'daki başlangıç noktası. Öntanımlı değer 0.İsteğe bağlıSayı
kaynakSonKaynak buffer'daki son nokta. Öntanımlı değer buffer.lengthİsteğe bağlıSayı

Örnek


> var str1 = new Buffer(10);
undefined
> var str2 = new Buffer(10);
undefined
> str1.write("abcdefghij");
10
> str2.write("**********");
10
> str1.toString();
'abcdefghij'
> str2.toString();
'**********'
> str1.copy(str2,2,3,5);
2
> str2.toString();
'**de******'
>

str1
abcdefghij
0123456789
str2
**********
0123456789
str2
**de******
0123456789

Yorumlar

Bu blogdaki popüler yayınlar

İç İçe Döngüler

CSS Bir Elemanın Genişliği ve Yüksekliği

JavaScript Dilinde Fonksiyon Çağırma Teknikleri