Blog

Python Struct Modülü

Python Struct Modülü

Merhaba !

Bildiğimiz üzere pythondaki sayısız modül sayesinde bir çok işlevi tekerleği yeniden keşfetmek zorunda kalmadan gerçekleştirebiliyoruz. Bu blogta python’ın soket programlama ve ağ paketlerine yönelik çalışmalarımda kullandığım struct modülünden bahsetmeye çalışacağım.

Struct Modülü Nedir & Ne İşe Yarar ?

Bu modül C yapıları ile python değerleri arasında dönüşüm işlevini gerçekleştirmektedir. Struct modülü sayesinde C yapılarından python string değerleri elde edebiliriz. Ağ bağlantılarından iletilen ve temel ağ iletişim katmanından kabul edilen paketlerin içerisindeki binary verileri işlerken (insan okuyabilir bir formata dönüştürmek için..) kullanılmaktadır.

Struct Modülünün Bazı Fonksiyonları
struct.error

Struct modülünün fonksiyonlarını kullanırken karşılaşılabilecek çeşitli hatalarda, neyin yanlış olduğunu açıklayan bir dize olarak tanımlanabilmektedir.

struct.pack(format, deger1, deger2, …)

Verilen değerleri belirtilen formata göre paketleyerek bir string değeri döndürülmesini sağlayan fonksiyondur. Python değerlerinin c yapılarına (Ağ bağlantı katmanı temel binary verisine) dönüşümünü sağlamaktadır. Bu işlem ağ işlemlerinde kapsülleme olarakta bilinmektedir. Ayrıca bu fonksiyon için verilen bağımsız değişkenler belrittiğimiz formatın ihtiyaç duyduğu değerlere tam olarak uyum sağlamak zorundadır.

struct.pack_into(format, buffer, offset, deger1, deger2, …)

Bu fonksiyon sayesinde verilen bağımsız değişkenler belirtilen formata göre paketlenir ve offset alanında belirtilen offsetten başlayarak paketlenen byte’ları yazılabilir ara belleğe yazar.

struct.unpack(format, string)

Yukarıda bahsettiğimiz pack() fonksiyonu tarafından paketlenmiş olan bir dizeyi belirttiğimiz formata uygun biçimde paketten çıkartmaktadır. Burada çıkarılan verinin tipi tuple yani demettir. Bildiğimiz üzere python demet veri türlerindeki değerler değiştirilemez. Herhangi bir demet elamanı için yeni atama işlemi yapılamaz. Bu noktada tabi demet elemanlarını değiştirmek için alternatif yollar sunulmaktadır. Örneğin bir demeti dilimleyerek yeni değer ile birleştirirsek sonuçta demete bir değer eklemiş oluruz. İkinci bir yol olarakta demetin elemanlarını değiştirilebilir veri türlerinden oluşturmaktır. Mesela demet elemanlarının listelerden oluşuyor olması buna bir örnektir.

Unpack fonksiyonu için önemli bir noktada şudur:

Dize, belirtilen formatın gerektirdiği veri miktarını tam olarak içermek zorundadır.

Kısaca len(string) = calcsize(format) eşitliğinin sağlanması gereklidir.

 Not: Konumuz değil ama yeri gelmişken akılda soru işareti kalmaması adına kısaca buraya not eklemek istiyorum. Konu bütünlüğü bozulmaması demetlerle ilgili olan kısmı blog sonuna ekledim.

struct.unpack_from(format, buffer[, offset=0])

Buffer’ı (tamponu) belirtilen formata göre göre paketten çıkarma işlemi yapılmaktadır. Burada çıkartılan veri tam olarak tek bir eleman bile olsa demet veri tipinde çıkarılmaktadır. Blog sonunda tek elemanlı demetler hakkında açıklama yapılmıştır. Burada önemli olan nokta belirtilen fonksiyon parametresi olarak belirtilen formatın gerektirdiği en az miktardaki veri arabellekte bulunmak zorundadır.

Bunuda kısaca şu eşitlikle anlatabiliriz;

len(buffer[offset:] değeri en az calcsize(format) değeri kadar olmalıdır.

struct.calcsize(format)

Yukarıdaki fonksiyonların açıklamalarında kullandıktan sonra calcsize() fonksiyonunu ne işe yaradığını kısa açıklayabiliriz. Pack ve unpack işlemlerinde kullanıcak olan formatın oluşturacağı yapının dolayısıylada döndürülecek olan dizenin boyutunu döndüren bir fonksiyondur.

Python demet veri tipleri hakkında kısa bir bilgilendirme, hatırlatma….

Boş demet tanımlamak için;

>>> bos_demet = ()

Tek elemanlı bir demet tanımlamak için;

>>> tek_elemanli_demet = 'hasan',

Burada dikkat ederseniz satır sonuna virgül ekledik. Peki virgül eklemeseydik ne olurdu ?

Eğer virgül eklemeseydik şöyle bir söz dizimi olacaktı ve bunun ne anlama geldiğini çok iyi biliyoruz !

>>> tek_elemanli_demet = 'hasan'

Bu komut ile tuple veritipinde bir değişken tanımlamadık aksine burada sadece bir string tanımlamış olduk.

(Python Demet Veri Tipinde Değişken Tanımlama Yöntemleri)

Burada demetler hakkında kısa bir hatırlatma yapma nedenim aslında demetleme ( tuple packing ) ve demet açma (sequence unpacking ) olarak tanımladığımız işlemlerdir. Ağ paketleri ve paket filtreleme gibi konular üzerine python modülleri geliştirirken bu ifadelerden ve yapılardan faydalanmaktayız. Yukarıda struct modülünü kullanarak yaptığmız pack ve unpack işlemlerine benzer olarak aşağıdaki örnekte demetler için paketleme ve paket açma işlemlerini hızlıca görebiliriz.

Buradaki paket işlemi (sequence unpacking ) esnasında dikkat edilmesi gereken bir husus var. Paket açma işlemi sırasında sol taraftaki değişken sayısı paket içerisinde bulunan elaman sayısına eşit olmak zorundadır. Burada aslında çoklu atama işlemi olarak yaptığımız bu uygulama aynı zamanda paketleme ve paket açma işlemlerinin bir bileşimidir. Bunuda unutmamakta fayda var !

 

(Demet Unpacking ve Çoklu Atama İşlemi)

(Demet Paketleme İşlemi)

 

(Struct Pack ve Unpack Fonksiyonlarının Kullanımı)

(Pack Edildikten Sonraki Paket İçeriği ve Unpack Edildikten Sonraki İçerik Görüntüsü)

Umarım faydalı bir içerik olmuştur.

Teşekkür ederim, iyi günler dilerim..


Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir