구성(피톤 라이브러리)

Construct (python library)

Construct선언적인 방식으로 데이터 구조를 구축하고 해체하기 위한 Python 라이브러리입니다.이 문맥에서 구축(construction)은 프로그래밍 객체를 이진 표현으로 변환(시리얼화)하는 프로세스를 말합니다.디컨스트럭션(파싱)은 바이너리 데이터를 프로그램 개체로 변환(비직렬화)하는 반대 프로세스를 말합니다.선언적이라는 것은 목표를 달성하기 위해 절차 코드를 작성하는 관례가 아니라 사용자 코드가 데이터 구조를 정의하는 것을 의미합니다.Construct는 비트 레벨 및 바이트 레벨의 데이터 입도 및 다양한 바이트 순서로 원활하게 작동할 수 있습니다.

선언 코드를 사용하면 많은 이점이 있습니다.예를 들어, 동일한 코드를 해석할 수 있으면 빌드(대칭)할 수도 있고 디버깅과 테스트가 훨씬 간단하며(어느 정도 제공 가능), 새로운 구성 요소를 쉽게 작성할 수 있습니다(컴포넌트 래핑).C(프로그래밍 언어)에 익숙하다면, 구성물을 다음에서 캐스팅하는 으로 생각할 수 있습니다.char *로.struct foo *데이터를 압축 해제하는 코드를 쓰는 대신 그 반대도 마찬가지입니다.

다음 예시는 Construct를 사용하여 TCP/IP 프로토콜 스택을 정의하는 방법을 보여 줍니다. 간결성과 단순성을 위해 일부 코드가 생략됩니다.또한 다음 코드는 객체를 생성하는 Python 코드일 뿐입니다.

번째로 이더넷헤더(레이어 2) :

 이더넷 = 구조("filen_filen_filen_filename",     바이트 수(「수신처", 6),     바이트 수("소스", 6),     열거형(UBInt16("타입"),         IPv4=0x0800,         ARP=0x0806,         RARP=0x8035,         X25=0x0805,         IPX=0x8137,         IPv6=0x86DD,     ),  ) 

다음에, IP 헤더(레이어 3)를 나타냅니다.

 아이피 = 구조("ip_module",     임베디드 비트 구조(         계속(니블("버전"), 4),         니블("module_length"),     ),     비트 구조("tos",         비트("일관성", 3),         플래그("filen_filen_filen_filename"),         플래그("high_throput"),         플래그("고신뢰성"),         플래그("cost_cost"),         패딩(1),     ),     UBInt16("total_length"),     # ...  ) 

마지막으로 TCP 헤더(레이어 4):

 tcp = 구조("filen_filen_filen_filename",     UBInt16("소스"),     UBInt16(「수신처"),     UBInt32("seq"),     UBInt32("확인"),     # ...  ) 

이제 프로토콜 스택의 계층을 정의합니다.다음 코드는 인접한 프로토콜의 각 쌍을 별도의 장치로 "바인드"합니다.이러한 각 장치는 포함된 프로토콜을 기반으로 적절한 다음 계층을 선택합니다.

 레이어4의 = 구조(레이어4,     짜넣기(tcp),     #... 페이로드  )   레이어 3ip = 구조(레이어3,     짜넣기(아이피),     스위치("다음", 람다 ctx: ctx["실패"],         {             "TCP" : 레이어4의,         }     ),  )   레이어 2개 = 구조(레이어2,     짜넣기(이더넷),     스위치("다음", 람다 ctx: ctx["타입"],         {             'IP' : 레이어 3ip,         }     ),  ) 

이 시점에서 코드는 캡처된 TCP/IP 프레임을 "패킷" 개체로 해석하고 이러한 패킷 개체를 바이너리 표현으로 다시 빌드할 수 있습니다.

 tcpip_stack = 레이어 2개  패킷 = tcpip_stack.해석("... 캡처된 패킷을 그대로...")  raw_data = tcpip_stack.구축하다(패킷) 

포트 및 스핀오프

Data::ParseBinary는 Perl 프로그래밍 언어에 대한 Construct 포트로 생성된 CPAN 모듈입니다.(영향을 얻으려면 기본 POD 문서를 참조하십시오).초기 버전 이후 원본 API의 일부는 사용되지 않습니다.

자바

Java 포트는 GitHub에서 사용할 수 있습니다.Java에서의 이더넷헤더(레이어 2)의 예:

 건설하다 ethernet_module = 구조("filen_filen_filen_filename",       MacAddress(Mac Address)(「수신처"),       MacAddress(Mac Address)("소스"),       열거형(UBInt16("타입"),           「IPv4」,  0x0800,           "ARP",   0x0806,           "RARP",  0x8035,           'X25',   0x0805,           "IPX",   0x8137,           「IPv6」,  0x86DD,           "_default_",  통과하다    )); 

외부 링크