JavaScript'te `ArrayBuffer`
Bu makale, JavaScript'teki ArrayBuffer
'i açıklar.
ArrayBuffer
hakkında her şeyi açıklayacağız; temellerinden kullanım şekillerine, ilgili türlerine ve pratik uygulamalarına kadar.
YouTube Video
JavaScript'te ArrayBuffer
JavaScript'in ArrayBuffer
'i, düşük seviyeli ikili verileri işlemek için bir nesnedir ve WebAPI'ler, dosya işlemleri ve ağ iletişimlerinde ikili verileri yönetmek için özellikle kullanışlıdır.
ArrayBuffer
Nedir
ArrayBuffer
, sabit uzunluklu ikili verileri işlemek için bir veri yapısıdır. Normal JavaScript dizileri veya nesneleri tarafından işlenemeyen ham ikili verilerin işlenmesine olanak tanır.
ArrayBuffer
kendisi doğrudan veri işleyemez. Bunun yerine, veriler TypedArray
veya DataView
kullanılarak bir ArrayBuffer
üzerinden okunur ve yazılır.
ArrayBuffer
özellikle aşağıdaki durumlarda faydalıdır.
- Ağdan alınan ikili verileri işlerken
Web Worker
içinde verimli veri paylaşımı gerektiğinde.- Canvas veya WebGL ile görüntü işleme veya 3D render yaparken.
- Dosyaları (özellikle ikili dosyaları) işlerken.
ArrayBuffer
Oluşturma
Önce, bir ArrayBuffer
örneğinin nasıl oluşturulacağına başlayalım. ArrayBuffer
, bellek tahsisini bayt biriminde yapar, bu yüzden oluşturulurken boyutunu belirtirsiniz.
1const buffer = new ArrayBuffer(16); // Create a 16-byte buffer
2console.log(buffer.byteLength); // 16
- Bu örnekte, 16 baytlık bir tampon tahsis ediliyor. Bu tampon şu an için herhangi bir veri içermiyor.
TypedArray
ile Verileri İşlemek
ArrayBuffer
'e doğrudan erişemezsiniz, bu yüzden veri okumak ve yazmak için bir TypedArray
kullanırsınız. TypedArray
, Int8Array
ve Float32Array
gibi farklı türlerde görünümler sağlar ve bu sayede ikili verilere verimli erişim mümkün olur.
Int8Array
Kullanımıyla Örnek
1const buffer = new ArrayBuffer(8); // Create an 8-byte buffer
2const int8View = new Int8Array(buffer); // Create an Int8Array
3
4int8View[0] = 42; // Write data to the first byte
5console.log(int8View[0]); // 42
Int8Array
, her bir baytta veri saklayabilir ve tamponun 8 eleman tutmasına olanak tanır. Bu şekilde, farklı türde görünümler kullanarak verileri verimli bir şekilde yönetebilirsiniz.
Diğer TypedArray
örnekleri
JavaScript, çeşitli TypedArray
türlerine sahiptir. Örneğin, 32-bit işaretsiz tam sayıları işlemek istiyorsanız, Uint32Array
kullanırsınız.
1const buffer = new ArrayBuffer(16);
2const uint32View = new Uint32Array(buffer);
3
4uint32View[0] = 123456;
5console.log(uint32View[0]); // 123456
Uint32Array
verileri 4 baytlık birimlerde depolayabilir, bu nedenle tampon dört öğe tutabilir. Ele aldığınız veri türüne göre doğruTypedArray
seçmek önemlidir.
DataView
kullanarak esnek veri yönetimi
TypedArray
yalnızca sabit bir türdeki verileri işleyebilir, ancak DataView
kullanarak herhangi bir türdeki veriyi herhangi bir konuma yazabilirsiniz. Bu, karışık veri türleri içeren tamponlarla çalışırken özellikle yararlıdır.
1const buffer = new ArrayBuffer(16);
2const dataView = new DataView(buffer);
3
4// Write a 32-bit signed integer to byte 0
5dataView.setInt32(0, 2147483647);
6console.log(dataView.getInt32(0)); // 2147483647
7
8// Write a 16-bit unsigned integer to byte 4
9dataView.setUint16(4, 65535);
10console.log(dataView.getUint16(4)); // 65535
DataView
kullanarak bayt ofsetini belirtebilir ve farklı türlerde veri okuyup yazabilirsiniz. Bu, ağ protokolleri veya dosya formatları gibi karmaşık ikili yapılarda çalışırken çok faydalıdır.
Endianness (Bayt Sırası) Düşüncesi
DataView
kullanırken, endianness (bayt sırası) konusuna da dikkat etmeniz gerekir. Bilgisayar mimarisine bağlı olarak, verilerin bellekte saklanma sırası farklılık gösterebilir. DataView
yöntemlerinin endianness belirtmek için seçenekleri vardır.
1const buffer = new ArrayBuffer(4);
2const view = new DataView(buffer);
3
4// Write a 32-bit integer in little-endian format
5view.setInt32(0, 42, true); // true indicates little-endian
6console.log(view.getInt32(0, true)); // 42
Doğru endianness belirtmezseniz, veri farklı ortamlarda doğru şekilde yorumlanamayabilir; bu nedenle ağ iletişimi veya dosya işlemlerinde özellikle dikkatli olmak önemlidir.
ArrayBuffer
Uygulamaları
ArrayBuffer
, genellikle web geliştirme ve tarayıcı API'lerinde kullanılan güçlü bir araçtır. Bazı uygulama örneklerine bakalım.
İkili Verilerin Alınması ve İşlenmesi
Örneğin, XMLHttpRequest
veya fetch
API'sini kullanarak bir sunucudan ikili veri alabilir ve bunu bir ArrayBuffer
olarak işleyebilirsiniz.
1fetch('https://codesparklab.com/image.jpg')
2 .then(response => response.arrayBuffer())
3 .then(buffer => {
4 const view = new Uint8Array(buffer);
5 console.log(view);
6 });
- Bu örnekte, görüntü verisi sunucudan alınır ve bir
Uint8Array
olarak işlenir. Bu şekilde, sunucudan alınan verileriArrayBuffer
kullanarak işleyebilirsiniz.
WebGL'de Kullanım
WebGL'de ArrayBuffer
, köşe verileri ve renk verileri gibi ikili verileri verimli bir şekilde işlemek için kullanılır.
1const vertices = new Float32Array([
2 -1.0, -1.0,
3 1.0, -1.0,
4 1.0, 1.0,
5 -1.0, 1.0
6]);
7
8// Send data to the WebGL buffer
9const buffer = gl.createBuffer();
10gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
11gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
- Bu örnekte,
Float32Array
bir dikdörtgenin köşe koordinatlarını tanımlamak ve bunları bir WebGL tamponuna göndermek için kullanılır.
ArrayBuffer
ve Bellek Yönetimi
ArrayBuffer
, belleği byte düzeyinde yönetir ve bu onu oldukça verimli hale getirir, ancak bellek yönetimi konusunda dikkatli olmanız gerekir. Büyük ikili verilerle çalışırken, kullanılmayan ArrayBuffer
'ları düzgün bir şekilde serbest bırakmak önemlidir. JavaScript otomatik olarak çöp toplama işlemi gerçekleştirse de, bir ArrayBuffer
referans almaya devam ederse bellek sızıntılarına yol açabilir.
Özet
ArrayBuffer
, JavaScript'te ikili veri işlemenin temelini sağlar. TypedArray
ve DataView
'i birleştirerek, ikili veriler hem verimli hem de esnek bir şekilde işlenebilir. Ağ iletişimi ve WebGL gibi ikili verilerin işlendiği birçok durumda, web geliştirme için vazgeçilmez araçlardır. Doğru bir şekilde anlayarak ve uygun şekilde kullanarak, performansı ve verimliliği artırabilirsiniz.
Yukarıdaki makaleyi, YouTube kanalımızda Visual Studio Code'u kullanarak takip edebilirsiniz. Lütfen YouTube kanalını da kontrol edin.