Oluştur (python kitaplığı) - Construct (python library)

İnşaat bir Python inşaatı ve yıkımı için kütüphane veri yapıları içinde beyan edici moda. Bu bağlamda, inşaat veya inşaat, dönüştürme sürecini ifade eder (serileştirme ) bir ikili gösterime programlı bir nesne. Yapısızlaştırma veya ayrıştırma, ikili verileri programlı bir nesneye dönüştürme (seriyi kaldırma) işleminin tersi anlamına gelir. Bildirimsel olmak, kullanıcı kodunun yazma kuralı yerine veri yapısını tanımladığı anlamına gelir. prosedür kodu hedefe ulaşmak için. Construct ile sorunsuz bir şekilde çalışabilir bit - ve bayt -düzey veri ayrıntı düzeyi ve çeşitli bayt sıralaması.

Bildirimsel kod kullanmanın birçok faydası vardır. Örneğin, ayrıştırabilen kod aynı zamanda oluşturabilir (simetrik), hata ayıklama ve test etme çok daha basittir (bir dereceye kadar kanıtlanabilir), yeni yapılar oluşturmak kolaydır (bileşenleri sarmak) ve çok daha fazlası. Biri aşina ise C (programlama dili) yapıları şöyle düşünebilir: döküm itibaren karakter * -e struct foo * ve tam tersi, verileri paketten çıkaran kod yazmak yerine.

Misal

Aşağıdaki örnek, bir TCP / IP protokol yığını Construct kullanılarak tanımlanabilir; kısalık ve basitlik için bazı kodlar atlanmıştır. Ayrıca aşağıdaki kodun yalnızca nesneleri oluşturan Python kodu olduğunu unutmayın.

İlk önce Ethernet başlık (katman 2):

 ethernet = Struct("ethernet_header",    Bayt("hedef", 6),    Bayt("kaynak", 6),    Sıralama(UBInt16("tür"),        IPv4=0x0800,        ARP=0x0806,        RARP=0x8035,        X25=0x0805,        IPX=0x8137,        IPv6=0x86DD,    ), )

Sonra, IP başlık (katman 3):

 ip = Struct("ip_header",    EmbeddedBitStruct(        Const(Nibble("sürüm"), 4),        Nibble("başlık_uzunluğu"),    ),    BitStruct("tos",        Bitler("öncelik", 3),        Bayrak("minimize_gecikme"),        Bayrak("high_throuput"),        Bayrak("yüksek güvenilirlik"),        Bayrak("minimize_cost"),        Dolgu malzemesi(1),    ),    UBInt16("toplam uzunluk"),    # ... )

Ve son olarak TCP başlık (katman 4):

 tcp = Struct("tcp_header",    UBInt16("kaynak"),    UBInt16("hedef"),    UBInt32("seq"),    UBInt32("ack"),    # ... )

Şimdi protokol yığınının hiyerarşisini tanımlayın. Aşağıdaki kod, her bir bitişik protokol çiftini ayrı bir birime "bağlar". Bu tür her birim, içerdiği protokole göre uygun bir sonraki katmanı "seçecektir".

 layer4tcp = Struct("katman4",    Göm(tcp),    # ... yük ) layer3ip = Struct("katman3",    Göm(ip),    Değiştirmek("Sonraki", lambda ctx: ctx["protokol"],        {            "TCP" : layer4tcp,        }    ), ) layer2ethernet = Struct("katman2",    Göm(ethernet),    Değiştirmek("Sonraki", lambda ctx: ctx["tür"],        {            "IP" : layer3ip,        }    ), )

Bu noktada, kod yakalanan TCP / IP çerçevelerini "paket" nesnelerine ayrıştırabilir ve bu paket nesnelerini tekrar ikili gösterime dönüştürür.

 tcpip_stack = layer2ethernet pkt = tcpip_stack.ayrıştırmak("... ham yakalanmış paket ...") işlenmemiş veri = tcpip_stack.inşa etmek(pkt)

Bağlantı noktaları ve yan ürünler

Perl

Veri :: ParseBinary bir CPAN bir Construct portu olarak ortaya çıkan modül Perl programlama dili. (görmek ana POD belgesi ilham almak için). İlk sürümden bu yana, orijinal API'nin bazı bölümleri kullanımdan kaldırıldı.

Java

Java için bir bağlantı noktası mevcut GitHub Java'daki örnekler, Ethernet başlık (katman 2):

 İnşaat ethernet_header = Struct("ethernet_header",      Mac Adresi("hedef"),      Mac Adresi("kaynak"),      Sıralama(UBInt16("tür"),          "IPv4",  0x0800,          "ARP",   0x0806,          "RARP",  0x8035,          "X25",   0x0805,          "IPX",   0x8137,          "IPv6",  0x86DD,          "_varsayılan_",  Geçmek   ));

Dış bağlantılar