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 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?
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.