อ่าน 3 นาที
Construct (ไลบรารี Python)
Construct เป็น ไลบรารี Python สำหรับการสร้างและการแยกส่วน โครงสร้างข้อมูล ใน ลักษณะ เชิงประกาศ ในบริบทนี้ การสร้างหรือการประกอบ หมายถึงกระบวนการแปลง ( การทำให้เป็นอนุกรม )...
Construct (ไลบรารี Python)
Constructเป็น ไลบรารี Pythonสำหรับการสร้างและการแยกส่วนโครงสร้างข้อมูลใน ลักษณะ เชิงประกาศในบริบทนี้ การสร้างหรือการประกอบ หมายถึงกระบวนการแปลง ( การทำให้เป็นอนุกรม ) วัตถุโปรแกรมให้เป็นรูปแบบไบนารี
การแยกส่วน หรือการวิเคราะห์โครงสร้าง หมายถึงกระบวนการตรงกันข้ามกับการแปลง (การดีซีเรียไลซ์) ข้อมูลไบนารีให้เป็นอ็อบเจ็กต์เชิงโปรแกรม การเป็นแบบประกาศหมายความว่าโค้ดของผู้ใช้กำหนดโครงสร้างข้อมูล แทนที่จะใช้การเขียนโค้ดแบบขั้นตอนเพื่อบรรลุเป้าหมายตามธรรมเนียมปฏิบัติ Construct สามารถทำงานได้อย่างราบรื่นกับข้อมูลระดับบิตและไบต์ รวมถึง ลำดับไบต์ต่างๆ
ประโยชน์
การใช้โค้ดแบบประกาศ (declarative code) มีข้อดีหลายประการ ตัวอย่างเช่น โค้ดเดียวกันที่สามารถแยกวิเคราะห์ (parse) ก็สามารถสร้าง (build) ได้เช่นกัน (สมมาตร) การดีบักและการทดสอบทำได้ง่ายขึ้นมาก (พิสูจน์ได้ในระดับหนึ่ง) การสร้างโครงสร้างใหม่ทำได้ง่าย (การห่อหุ้มส่วนประกอบ) และอื่นๆ อีกมากมาย หากคุ้นเคยกับภาษาC (ภาษาโปรแกรม)ก็สามารถคิดถึงโครงสร้างต่างๆ ในแง่ของการแปลงchar *ประเภทstruct foo *ข้อมูล แทนที่จะเขียนโค้ดที่แยกข้อมูลออกมา
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงวิธีการกำหนด สแต็กโปรโตคอลTCP/IP โดยใช้ Construct มีการละเว้นโค้ดบางส่วนเพื่อความกระชับและเรียบง่าย โปรดทราบว่าโค้ดต่อไปนี้เป็นเพียงโค้ด Python ที่สร้างอ็อบเจ็กต์เท่านั้น
อันดับแรกส่วนหัวของอีเธอร์เน็ต (เลเยอร์ 2):
ethernet = Struct ( "destination" / Bytes ( 6 ), "source" / Bytes ( 6 ), "type" / Enum ( Int16ub , IPv4 = 0x0800 , ARP = 0x0806 , RARP = 0x8035 , X25 = 0x0805 , IPX = 0x8137 , IPv6 = 0x86DD , ), )ถัดไปคือ ส่วนหัวของ IP (เลเยอร์ 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 captured packet ... " ) raw_data = tcpip_stack.build ( packet )พอร์ตและภาคแยก
เพิร์ล
Data::ParseBinary [ 1 ]เป็น โมดูล CPANที่มีต้นกำเนิดมาจากการพอร์ต Construct ไปยังภาษาการเขียนโปรแกรม Perl (ดูเอกสาร POD หลักสำหรับแรงบันดาลใจ) นับตั้งแต่เวอร์ชันเริ่มต้น บางส่วนของ API ดั้งเดิมได้ถูกยกเลิกการใช้งานแล้ว
ชวา
พอร์ตไปยัง Java มีให้บริการบน GitHub [ 2 ]ตัวอย่างใน Java ส่วนหัว Ethernet (เลเยอร์ 2):
สร้าง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 ));ดูเพิ่มเติม
ลิงก์ภายนอก
- เอกสารประกอบของ Construct
- คลังเก็บข้อมูลของ Construct
- การฝึกอบรม Python
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ Construct (ไลบรารี Python)
Construct เป็น ไลบรารี Python สำหรับการสร้างและการแยกส่วน โครงสร้างข้อมูล ใน ลักษณะ เชิงประกาศ ในบริบทนี้ การสร้างหรือการประกอบ หมายถึงกระบวนการแปลง ( การทำให้เป็นอนุกรม )...
ประโยชน์
การใช้โค้ดแบบประกาศ (declarative code) มีข้อดีหลายประการ ตัวอย่างเช่น โค้ดเดียวกันที่สามารถแยกวิเคราะห์ (parse) ก็สามารถสร้าง (build) ได้เช่นกัน (สมมาตร) การดีบักและการทดสอบทำได้ง่ายขึ้นมาก (พิสูจน์ได้ในระดับหนึ่ง) การสร้างโครงสร้างใหม่ทำได้ง่าย...
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงวิธีการกำหนด สแต็กโปรโตคอล TCP/IP โดยใช้ Construct มีการละเว้นโค้ดบางส่วนเพื่อความกระชับและเรียบง่าย โปรดทราบว่าโค้ดต่อไปนี้เป็นเพียงโค้ด Python ที่สร้างอ็อบเจ็กต์เท่านั้น
เพิร์ล
Data::ParseBinary [ 1 ] เป็น โมดูล CPAN ที่มีต้นกำเนิดมาจากการพอร์ต Construct ไปยัง ภาษาการเขียนโปรแกรม Perl (ดูเอกสาร POD หลักสำหรับแรงบันดาลใจ) นับตั้งแต่เวอร์ชันเริ่มต้น บางส่วนของ API ดั้งเดิมได้ถูกยกเลิกการใช้งานแล้ว