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
Ad | Anlamı | Tipi |
n | Buffer'ın boyutu | Sayı (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
Ad | Anlamı | Tipi |
Dizi | Verilen bir dizi | Dizi |
Ö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:
Onluk | On altılık (Hexadecimal) | Onluk | On altılık |
0 | 0 | 8 | 8 |
1 | 1 | 9 | 9 |
2 | 2 | 10 | A |
3 | 3 | 11 | B |
4 | 4 | 12 | C |
5 | 5 | 13 | D |
6 | 6 | 14 | E |
7 | 7 | 15 | F |
(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
Ad | Anlamı | Zorunlu / İsteğe bağlı | Tipi |
String | Verilen string | Zorunlu | String |
Kodlama | Kullanı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
Ad | Anlamı | Tipi |
Kodlama | Kodlama Tipi | String |
Ö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:
Ad | Açıklama | Zorunlu / İsteğe bağlı | Tip |
String | Yazılacak string | Zorunlu | String |
Offset | Yazmanın başlayacağı yeri belirleyen bir indis değeridir. Öntanımlı değer 0'dır. | İsteğe bağlı | Sayı |
Uzunluk | Yazılacak stringin uzunluğudur. Öntanımlı değer, "buffer.length-offset" şeklindedir. | İsteğe bağlı | Sayı |
Kodlama | Kullanı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
Ad | Açıklama | Zorunlu / İsteğe bağlı | Tip |
Kodlama | Kodlama 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ı |
Son | Okumanı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
Ad | Tanım | Zorunlu / İsteğe bağlı | Tip |
String | Verilen bir string | Zorunlu | String |
S | Bir 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
Ad | Açıklama | Zorunlu / İsteğe bağlı | Tip |
liste | Eklenecek buffer elemanlarının listesi | Zorunlu | Dizi |
toplamuzunluk | Buffer 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
Ad | Açıklama | Zorunlu / İsteğe bağlı | Tip |
basla | Buffer'da başlangıç pozisyonu. Öntanımlı 0. | İsteğe bağlı | Sayı |
son | Bufferda 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'
>
a | b | c | d | e | f | g | h |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
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
Ad | Açıklama | Zorunlu / İsteğe bağlı | Tip |
hedefBuffer | İçine kopyanın aktarılacağı buffer | Zorunlu | Buffer nesnesi |
hederBasla | Hedef buffer'daki başlangıç noktası. Öntanımlı değer 0. | İsteğe bağlı | Sayı |
kaynakBasla | Kaynak buffer'daki başlangıç noktası. Öntanımlı değer 0. | İsteğe bağlı | Sayı |
kaynakSon | Kaynak 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
a | b | c | d | e | f | g | h | i | j |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
str2
* | * | * | * | * | * | * | * | * | * |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
str2
* | * | d | e | * | * | * | * | * | * |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Yorumlar
Yorum Gönder