Bilgisayar sistemlerinde her dosya türü farklı amaçlarla kullanılır. Genelde mov ve avi gibi dosya türleri video’larda kullanılırken, png, jpg ve gif ise görseller için kullanılmakta. Fakat dosya türlerinin farklılıkları sadece isimleriyle kalmıyor. Her dosya türünün kendine özel specification’ları bulunur; yani ilgili dosya türünün nasıl encode ve decode edileceğini belirten bir dökümantasyona sahiptir.

İnsanlara göre dosya türleri text ve binary olarak ikiye ayrılırken bilgisayar tarafından hepsi bit’lerden oluşan birer dosya olarak görülür. Bir html dosyası genelde insanların yazıp anlayabileceği karakterlerden meydana gelir. html dosyalarını bir metin editörüyle açarsak size hiç de yabancı gelmeyen karakterler görürüz. Fakat bir binary dosyasını metin editörüyle açmaya kalkarsak büyük ihtimalle tanıdık bir karakter göremeyeceğiz. Çünkü metin editörleri, dosyaları açarken içeriğinin ASCII veya UTF-8 gibi yaygın karakter setine sahip olduğunu umarak açar ve bit’leri setteki karakterlere çevirip göstermeye çalışırlar.

Binary dosya türlerinin yapıları ise birbirinden farklılık gösterir. Bir çok dosya formatı bulunur ve her biri kendi amacına hizmet edecek şekilde tasarlanmıştır. Bu tasarımlara specification denir. Dosya yaratılırken veya okunurken bu specificasyona göre işlem yapılır. Bu yazıda örnekleri PNG dosya formatına göre yapacağız. Şimdi bir PNG dosyasının içeriğine göz atmakla başlayalım.

Her bir binary dosyası kendisine özel signature yani imzaya sahiptir. PNG dosya formatının specification dökümanlarında belirttiği gibi, decimal biçimindeki signature içeriği şudur: 137 80 78 71 13 10 26 10. Her PNG dosyasının ilk 8 byte’ı bu signature’den meydana gelir. Dosya formatlarındaki signature’lerin amacı, ilgili dosya türünün doğrulanması ve belirlenmesidir.

Kendime GIMP kullanarak 10x10 boyutunda, yarısı yeşil yarısı kırmızı olan bir PNG dosyası oluşturdum.

Bu dosyanın içeriğini hexdump komutuyla görüntülersek:

$> hexdump -C resim.png
00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|
00000010  00 00 00 0a 00 00 00 0a  08 02 00 00 00 02 50 58  |..............PX|
00000020  ea 00 00 02 ff 7a 54 58  74 52 61 77 20 70 72 6f  |.....zTXtRaw pro|
00000030  66 69 6c 65 20 74 79 70  65 20 65 78 69 66 00 00  |file type exif..|
00000040  78 da ad 96 6d 72 e4 28  0c 86 ff 73 8a 3d 02 fa  |x...mr.(...s.=..|
00000050  42 e2 38 32 1f 55 7b 83  39 fe 08 db e9 cc ce a6  |B.82.U{.9.......|
...

hexdump çıktısında en sol taraftaki hücrede her satıra ait adresler, ortadaki hücrede dosya içeriğinin hex biçimindeki bit’leri, en sağdaki hücrede ise bu bitlerin ASCII biçimine çevrilmiş halleri bulunuyor. ASCII biçiminde gösterilemeyen bit’ler ise nokta (.) simgesiyle gösteriliyor. Çıktıda verilen ilk 8 byte’lık içeriği 89 50 4e 47 0d 0a 1a 0a hexadecimal’den decimal’e çevirdiğimizde 137 80 78 71 13 10 26 10 sonucunu alırız. Demek ki specification’a uyan bir signature. Öyleyse bunun gerçek bir PNG dosyası olduğunu doğrulayabiliriz. Bu arada 8 adet bit’in 1 byte’a eşit olduğunu da hatırlatmak isterim.

Signature’den sonrası hep yığınlardan (chunk) meydana gelir. Yığınlar çoğunlukla dört parçadan meydana gelir: uzunluk (4 byte), tür (4 byte), data ve CRC checksum (4 byte). “Çoğunlukla” çünkü bazılarında data bulunmayabilir. Signature’ün hemen ardından gelen ilk yığın IHDR ismindeki header yığınıdır. hexdump çıktısındaki 49 48 44 52 hex değerinin ASCII karşlığı olan IHDR bu yığının türü oluyor. Ondan önce de 4 byte’lık bu yığının data uzunluğu bilgisi bulunuyor. Bu anlatımı görselleştirirsek daha anlaşılır olur sanki?

PNG chunk

Bu IHDR yığın datasında, oluşturduğumuz PNG resmine ait temel bilgiler yer alıyor; genişlik (4 byte), yükseklik (4 byte), bit derinliği (1 byte), renk türü (1 byte), sıkıştırma metodu (1 byte), filtre metodu (1 byte) ve karıştırma metodu (1 byte).

Bir PNG dosyasında, specification’da tanımlı 18 farklı yığın türü bulunur. IHDR ve IEND haricinde, yığınların belirli bir sıraya göre eklenmesi gerekmez. Önem derecelerine göre iki farklı kategoriye ayılırlar.

Renk bilgilerinin yer aldığı PLTE yığını, asıl görüntüye ait olan IDAT yığın(lar)ı, bir de dosyanın en sonunda yer alan IEND isimli bir yığın bulunur. IEND yığınında data bulunmaz bu yüzden data uzunluğu sıfır olarak belirtilir. Buraya kadar anlattığımız yığınlara “critical chunks” yani kritik yığınlar denmektedir.

Diğer türdeki yığınlara “ancillary chunks” yani ikincil yığınlar denir. İkincil yığınlarda sadece kritik öneme sahip olmayan detaylar yer alır. Mesela cHRM ve gAMA isimli yığınlarda renk uzaylarına ait bilgiler yer alırken, tEXt yığın(lar)ında resme ait kullanıcı tarafından oluşturulmuş bilgiler (title, author, comments vs..) yer alır.

Bir PNG dosyası oluşturmak veya görüntülemek isteyen bir yazılım, işte PNG dosya formatı gibi önceden belirlenmiş bu specification’lara göre işlem yapar. Umarım bu makale, dosya formatlarını anlamada yardımcı olabilmiştir.