Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!
[NODE JS] Buffer ile Binary Veri İşleme
Binary veri işleme, Node.js'in sunucu tarafında en güçlü olduğu alanlardan biridir. Dosya formatlarını parse etmek, ağ protokollerini uygulamak, kriptografik işlemler yapmak ve donanımla iletişim kurmak gibi düşük seviye görevler binary veri manipülasyonu gerektirir. Ben ilk binary veri işleme deneyimimi bir görüntü işleme projesinde yaşadım. PNG dosyalarının başlık bilgilerini okuyarak boyut ve renk derinliği bilgilerini çıkarmam gerekiyordu. Bu proje bana byte düzeyinde düşünmeyi öğretti.
Binary veri, bilgisayarın anlayabildiği en temel veri formatıdır. Her şey sonunda bit ve byte'lardan oluşur: metinler, resimler, sesler, videolar. Buffer sınıfı, bu byte dizileri üzerinde hassas kontrol sağlar. Belirli bir konumdan belirli bir uzunlukta veri okumak, farklı veri tiplerini (integer, float, double) binary formatta yazmak ve okumak gibi işlemler Buffer'ın güçlü yönleridir.
Byte sıralaması (endianness) binary veri işlemede kritik bir kavramdır. Big Endian (BE) formatında en anlamlı byte önce gelir, Little Endian (LE) formatında ise en az anlamlı byte önce gelir. Ağ protokolleri genellikle Big Endian kullanır (bu yüzden "network byte order" olarak da adlandırılır), Intel/AMD işlemciler ise Little Endian kullanır. Yanlış byte sıralaması kullanmak verilerin tamamen yanlış yorumlanmasına neden olur.
Dosya formatı analizi, binary veri işlemenin en yaygın uygulamalarından biridir. Her dosya formatının kendine özgü bir yapısı vardır. Örneğin PNG dosyaları 0x89504E47 ile başlar, ZIP dosyaları 0x504B0304 ile başlar, PDF dosyaları 0x25504446 ile başlar. Bu "magic numbers" kontrolü yaparak dosya türünü güvenilir bir şekilde tespit edebilirsiniz. Dosya uzantısı yanıltıcı olabilir ama magic numbers yalan söylemez.
Bit düzeyinde işlemler de binary veri işlemenin önemli bir parçasıdır. AND, OR, XOR, NOT, shift gibi bitwise operatörler kullanarak bayrak kontrolleri, maskeleme işlemleri ve veri paketleme yapabilirsiniz. Örneğin bir byte içinde 8 farklı boolean değeri saklayabilirsiniz. Bu teknik bellek kullanımını optimize etmek ve ağ trafiğini azaltmak için sıklıkla kullanılır.
TypedArray ve DataView sınıfları, Buffer'a alternatif olarak binary veri işleme imkanı sunar. Buffer aslında Uint8Array'in bir alt sınıfıdır. DataView ise farklı byte sıralamalarıyla okuma/yazma yapmanıza olanak tanır. Performans kritik uygulamalarda TypedArray kullanmak avantaj sağlayabilir çünkü V8 motoru bu yapıları optimize edebilir.
Ağ protokolleri uygulamak binary veri işlemenin en ileri seviye kullanımlarından biridir. TCP üzerinden özel bir protokol tasarlarken mesaj çerçeveleme, başlık yapıları ve veri serileştirme konularında derinlemesine binary bilgi gerekir. Bu tür uygulamalarda her byte'ın anlamı önceden belirlenmiştir ve yanlış bir okuma tüm iletişimi bozabilir.
JavaScript:
const { Buffer } = require('buffer');
// ===== DOSYA FORMATI ANALİZİ =====
// Dosya tipi tespiti (magic numbers)
function dosyaTipiTespit(buffer) {
const imzalar = [
{ tip: 'PNG', bytes: [0x89, 0x50, 0x4E, 0x47] },
{ tip: 'JPEG', bytes: [0xFF, 0xD8, 0xFF] },
{ tip: 'GIF', bytes: [0x47, 0x49, 0x46, 0x38] },
{ tip: 'PDF', bytes: [0x25, 0x50, 0x44, 0x46] },
{ tip: 'ZIP', bytes: [0x50, 0x4B, 0x03, 0x04] },
{ tip: 'MP3', bytes: [0x49, 0x44, 0x33] },
{ tip: 'WAV', bytes: [0x52, 0x49, 0x46, 0x46] },
{ tip: 'BMP', bytes: [0x42, 0x4D] }
];
for (const imza of imzalar) {
let eslesme = true;
for (let i = 0; i < imza.bytes.length; i++) {
if (buffer[i] !== imza.bytes[i]) {
eslesme = false;
break;
}
}
if (eslesme) return imza.tip;
}
return 'BİLİNMEYEN';
}
// PNG başlık simülasyonu ve analizi
const pngBaslik = Buffer.from([
0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, // PNG imzası
0x00, 0x00, 0x00, 0x0D, // IHDR chunk uzunluğu (13 byte)
0x49, 0x48, 0x44, 0x52, // "IHDR" chunk tipi
0x00, 0x00, 0x03, 0x20, // Genişlik: 800
0x00, 0x00, 0x02, 0x58, // Yükseklik: 600
0x08, // Bit derinliği: 8
0x06, // Renk tipi: 6 (RGBA)
0x00, 0x00, 0x00 // Sıkıştırma, filtre, interlace
]);
console.log('Dosya tipi:', dosyaTipiTespit(pngBaslik));
console.log('Genişlik:', pngBaslik.readUInt32BE(16), 'piksel');
console.log('Yükseklik:', pngBaslik.readUInt32BE(20), 'piksel');
console.log('Bit derinliği:', pngBaslik[24]);
const renkTipleri = { 0: 'Gri', 2: 'RGB', 3: 'Palette', 4: 'GriAlfa', 6: 'RGBA' };
console.log('Renk tipi:', renkTipleri[pngBaslik[25]] || 'Bilinmeyen');
// ===== ÖZEL BİNARY PROTOKOL OLUŞTURMA =====
// Basit mesaj protokolü:
// [2 byte: mesaj tipi] [4 byte: veri uzunluğu] [N byte: veri]
class MesajProtokolu {
static TIPLER = {
METIN: 0x0001,
DOSYA: 0x0002,
KOMUT: 0x0003,
YANITLA: 0x0004
};
// Mesaj oluştur (paketleme)
static paketle(tip, veri) {
const veriBuffer = Buffer.isBuffer(veri) ? veri : Buffer.from(veri, 'utf-8');
const baslik = Buffer.alloc(6);
baslik.writeUInt16BE(tip, 0); // 2 byte: mesaj tipi
baslik.writeUInt32BE(veriBuffer.length, 2); // 4 byte: veri uzunluğu
const paket = Buffer.concat([baslik, veriBuffer]);
console.log('Paket oluşturuldu: ' + paket.length + ' byte (başlık: 6, veri: ' + veriBuffer.length + ')');
return paket;
}
// Mesaj çöz (ayrıştırma)
static coz(paketBuffer) {
if (paketBuffer.length < 6) {
throw new Error('Paket çok kısa: en az 6 byte gerekli');
}
const tip = paketBuffer.readUInt16BE(0);
const veriUzunlugu = paketBuffer.readUInt32BE(2);
if (paketBuffer.length < 6 + veriUzunlugu) {
throw new Error('Eksik veri: ' + veriUzunlugu + ' byte bekleniyor, ' + (paketBuffer.length - 6) + ' byte mevcut');
}
const veri = paketBuffer.slice(6, 6 + veriUzunlugu);
// Tip ismini bul
const tipIsmi = Object.keys(MesajProtokolu.TIPLER)
.find(k => MesajProtokolu.TIPLER[k] === tip) || 'BİLİNMEYEN';
return { tip, tipIsmi, veriUzunlugu, veri, metin: veri.toString('utf-8') };
}
}
// Protokol kullanım örneği
const mesaj = MesajProtokolu.paketle(MesajProtokolu.TIPLER.METIN, 'Sunucuya bağlantı başarılı!');
const cozulmus = MesajProtokolu.coz(mesaj);
console.log('Çözülen mesaj:', cozulmus);
// ===== BİT DÜZEYİNDE İŞLEMLER =====
// İzin bayrakları (Unix dosya izinleri gibi)
const IZINLER = {
OKUMA: 0b00000001, // 1
YAZMA: 0b00000010, // 2
CALISTIR: 0b00000100, // 4
ADMIN: 0b00001000, // 8
SILME: 0b00010000 // 16
};
// İzin bayraklarını ayarla
let kullaniciIzin = 0;
kullaniciIzin |= IZINLER.OKUMA; // Okuma izni ekle
kullaniciIzin |= IZINLER.YAZMA; // Yazma izni ekle
kullaniciIzin |= IZINLER.CALISTIR; // Çalıştırma izni ekle
// İzin kontrolü
function izinKontrol(bayraklar, izin) {
return (bayraklar & izin) !== 0;
}
console.log('
--- İzin Kontrolleri ---');
console.log('Okuma izni:', izinKontrol(kullaniciIzin, IZINLER.OKUMA)); // true
console.log('Admin izni:', izinKontrol(kullaniciIzin, IZINLER.ADMIN)); // false
console.log('Silme izni:', izinKontrol(kullaniciIzin, IZINLER.SILME)); // false
console.log('İzin byte değeri:', kullaniciIzin); // 7 (1+2+4)
// İzin kaldır
kullaniciIzin &= ~IZINLER.YAZMA; // Yazma iznini kaldır
console.log('Yazma kaldırıldı:', izinKontrol(kullaniciIzin, IZINLER.YAZMA)); // false
// Buffer ile checksum hesaplama (basit XOR checksum)
function xorChecksum(buffer) {
let checksum = 0;
for (let i = 0; i < buffer.length; i++) {
checksum ^= buffer[i];
}
return checksum;
}
const veri = Buffer.from('Kontrol toplamı testi için örnek veri');
console.log('
XOR Checksum:', '0x' + xorChecksum(veri).toString(16).padStart(2, '0'));
Binary veri işleme, Node.js'in düşük seviye programlama yeteneklerinin tam gücünü ortaya koyar. Dosya formatı analizi, özel protokol tasarımı ve bit düzeyinde işlemler gibi beceriler, sizi sıradan bir web geliştiriciden sistem programcısı seviyesine taşır. Bu bilgilerle IoT cihazlarıyla iletişim, özel dosya formatları oluşturma ve ağ protokolleri geliştirme gibi ileri düzey projelere adım atabilirsiniz.
Emeğiniz ve katkınız için teşekkür ederiz!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 3
- Görüntüleme
- 480
- Kilitli
- Cevaplar
- 7
- Görüntüleme
- 2K
- Kilitli
- Cevaplar
- 1
- Görüntüleme
- 445
- Cevaplar
- 0
- Görüntüleme
- 28
