Python ile dosya formatı oluşturma ve okuma

Assembly derslerine devam edeceğiz fakat bunu paylaşma ihtiyacı duydum, örnek üzerinden kısa tutacağım.

Python ile dosya formatı oluşturma ve okuma

Her dilde olduğu gibi ikili (binary diye geçen) dosya formatları .txt, .csv gibi formatlara nazaran daha çok bilgileri gizlemeye yarayan formatlardandır. En basit örneği Windows’un çalıştırılabilir dosya formatı olan .exe veya bir çok oyun dosyalarını incelerken karşılaştığımız, .dat, .pak gibi dosya formatlarıdır. Yapısı bilindiği takdirde tüm dosya formatlarını herhangi bir yazılım dili kullanarak okuyabilirsiniz.

Bu kısa derste Python’un struct adlı modülü üzerinden gideceğiz. Bu modül oldukça karışık olduğu için 2014 yılında modülü daha basitleştirerek farklı brw (BinaryReaderWriter) adlı modül yazmıştım. Bu modüle github adresimden ulaşabilirsiniz. Kısa bir ders olacağından kendi yazdığım modül üzerinden devam edeceğim.

Hemen hemen her dosya formatında offset değerlerinde dosya formatının imzası bulunur. Bu imza string türünde olup geliştirenin oluşturduğu bir şeydir. Koyma zorunluluğu size kalmıştır.

Örneğin bir oyun yapıyorsunuz, mmorpg tarzı bir oyun olduğu var sayalım ve oyunda mevcut olan itemleri .txt belgesi gibi basit bir yerde tutmak istemiyorsunuz, farklı bir format arayışındasınız ve kafanıza .csv gibi formatlar da yatmıyor. Hepsi string tabanlı olduğundan herkes okuyabilir ve bilgilerinizin paylaşılmasını istemiyorsunuz.

Öncelikle bir yapı oluşturmanız gerekiyor, kağıt kalemle çok daha harika sonuçlar elde edebiliyorsunuz.

Bizim yapımız şu şekilde olsun;

#ITEM_ID ITEM_TURU ICON_PATH MODEL_PATH ACIKLAMA

Basitçe yapımız bu şekilde var sayabiliriz. Tabi bu belge görünümü, binary olarak yazdığımızda okuyabileceğiniz pek bir şey olmayacak. Bu yapıyı belge türünden (.txt) biraz dolduralım.

ICON_PATH, MODEL_PATH ve ACIKLAMA sütunları string ifadeler bunları pek değiştiremeyebiliriz. Fakat ITEM_TURU sütunundaki string gibi görünen ifadelere birer değer atayarak bunları bayrak (flag) olarak nitelendirmemiz ikili dosya formatlarında avantajımıza olacaktır.

NW_LINE değeri -1 fakat bu yeni satır anlamına gelmez, daha kolay anlaşılması açısından -1 değerine sahip item id’si kendi oyun dosyamda olmasına izin vermeyeceğimden böyle bir şeye ihtiyaç duydum. Yapmasanız da olurdu.

 

Bonus örnek;

Yukarıdaki örneğin okuma kısmını size bırakıyorum.

Daha önceden arşivlediğim ikili dosya formatlarının offsetleri hakkında detaylı bilgi için tıklayarak rar dosyasının indirebilirsiniz. RAR dosyasında şu formatlar mevcuttur. (RAR şifresi resim üzerinde yazılıdır)

Leave a Reply

Your email address will not be published. Required fields are marked *