Construct (مكتبة بايثون)

Construct هي مكتبة بايثون تُستخدم لإنشاء وتفكيك هياكل البيانات بطريقة تصريحية . في هذا السياق، يشير مصطلح "الإنشاء" أو "البناء" إلى عملية تحويل ( تسلسل ) كائن برمجي إلى تمثيل ثنائي.

يشير التفكيك، أو التحليل، إلى العملية المعاكسة لتحويل (فك تسلسل) البيانات الثنائية إلى كائن برمجي. وكونها تصريحية يعني أن كود المستخدم يُحدد بنية البيانات، بدلاً من اتباع أسلوب كتابة التعليمات البرمجية الإجرائية لتحقيق الهدف. ويمكن لـ Construct العمل بسلاسة مع دقة البيانات على مستوى البت والبايت ، ومع ترتيبات البايت المختلفة .

فوائد

يُوفر استخدام البرمجة التصريحية العديد من المزايا. على سبيل المثال، يُمكن استخدام نفس الكود الذي يُمكنه تحليل البيانات وبنائها (متناظر)، كما أن تصحيح الأخطاء واختبارها أسهل بكثير (قابل للإثبات إلى حد ما)، ويُصبح إنشاء بنيات جديدة أمرًا سهلاً (تغليف المكونات)، وغير ذلك الكثير. إذا كان المستخدم مُلمًا بلغة البرمجة C ، فيُمكنه اعتبار البنيات بمثابة تحويل من نوع إلى آخر والعكس، بدلاً من كتابة كود يُفكك البيانات.char *struct foo *

مثال

يوضح المثال التالي كيفية تعريف حزمة بروتوكولات TCP/IP باستخدام Construct. تم حذف بعض الأكواد للاختصار والتبسيط. تجدر الإشارة أيضًا إلى أن الكود التالي هو مجرد كود بايثون يقوم بإنشاء الكائنات.

أولاً، رأس الإيثرنت (الطبقة 2):

إيثرنت = بنية ( "الوجهة" / بايتات ( 6 ), "المصدر" / بايتات ( 6 ), "النوع" / تعداد ( Int16ub , IPv4 = 0x0800 , ARP = 0x0806 , RARP = 0x8035 , X25 = 0x0805 , IPX = 0x8137 , IPv6 = 0x86DD , ), )

ثم، رأس بروتوكول الإنترنت (الطبقة 3):

ip = Struct ( "header" / BitStruct ( "version" / Const ( Nibble , 4 ), "header_length" / Nibble , ), "tos" / BitStruct ( "precedence" / Bytes ( 3 ), "minimize_delay" / Flag , "high_throuput" / Flag , "high_reliability" / Flag , "minimize_cost" / Flag , Padding ( 1 ), ), "total_length" / Int16ub , # ... )

وأخيرًا، رأس بروتوكول TCP (الطبقة 4):

tcp = Struct ( "source" / Int16ub , "destination" / Int16ub , "seq" / Int32ub , "ack" / Int32ub , # ... )

الآن، حدد التسلسل الهرمي لمجموعة البروتوكولات. يقوم الكود التالي بربط كل زوج من البروتوكولات المتجاورة في وحدة منفصلة. وستختار كل وحدة من هذه الوحدات الطبقة التالية المناسبة بناءً على البروتوكول الذي تحتويه.

layer4tcp = Struct ( tcp , # ... payload )layer3ip = Struct ( ip , "next" / Switch ( this . protocol , { "TCP" : layer4tcp , } ), )layer2ethernet = Struct ( ethernet , "next" / Switch ( this . type , { "IP" : layer3ip , } ), )

في هذه المرحلة، يمكن للبرنامج تحليل إطارات TCP/IP الملتقطة إلى كائنات "حزمة" وإعادة بناء كائنات الحزمة هذه إلى تمثيل ثنائي.

tcpip_stack = layer2ethernet packet = tcpip_stack.parse ( b " ... raw capture packet ... " ) raw_data = tcpip_stack.build ( packet )

المنافذ والشركات المشتقة

بيرل

Data::ParseBinary [ 1 ] هي وحدة CPAN نشأت كمنفذ لـ Construct إلى لغة برمجة Perl . (راجع وثيقة POD الرئيسية الخاصة بها لمعرفة مصدر إلهامها). منذ الإصدار الأولي، تم إيقاف بعض أجزاء واجهة برمجة التطبيقات الأصلية.

جافا

يتوفر منفذ Java على GitHub. [ 2 ] أمثلة بلغة Java، رأس Ethernet (الطبقة 2):

Construct ethernet_header = Struct ( "ethernet_header" , MacAddress ( "destination" ), MacAddress ( "source " ), Enum ( UBInt16 ( "type" ), "IPv4" , 0x0800 , "ARP" , 0x0806 , "RARP" , 0x8035 , "X25" , 0x0805 , "IPX" , 0x8137 , "IPv6" , 0x86DD , "_default_" , Pass ));

انظر أيضاً

مراجع

  1. "Data::ParseBinary - محلل آخر للهياكل الثنائية - metacpan.org" . metacpan.org . تم الاطلاع عليه بتاريخ 29-08-2023 .
  2. ^ زيجليولي ، إيمانويل (29/12/2022)، زيجليو المملكة المتحدة / بناء ، استرجاعها 2023/08/29