2009-10-08 2 views
1

저는 파이썬에서 ASCII 문자열 (읽기 : EOL 종료 됨)과 바이너리 데이터를 모두 전송할 수 있어야하는 기본 네트워킹 프로토콜로 작업하고 있습니다. 후자가 가능하기 때문에 나는 바이너리가 될 바이트 수를 포함하는 문법을 작성하기로했다.런타임까지 SimpleParse 비 결정적 문법

SimpleParse의 경우, 문법이 [1] 지금까지 같을 것이다

EOL := [\n] 
IDENTIFIER := [a-zA-Z0-9_-]+ 
SIZE_INTEGER := [1-9]*[0-9]+ 
ASCII_VALUE := [^\n\0]+, EOL 
BINARY_VALUE := .*+ 
value := (ASCII_VALUE/BINARY_VALUE) 

eol_attribute := IDENTIFIER, ':', value 
binary_attribute := IDENTIFIER, [\t], SIZE_INTEGER, ':', value 
attributes := (eol_attribute/binary_attribute)+ 

command := IDENTIFIER, EOL 
command := IDENTIFIER, '{', attributes, '}' 

을 문제는 나는 다음과 같은 바이너리 데이터의 척 될 것입니다 것을 SimpleParse의 지시하는 방법을 몰라 SIZE_INTEGER 바이트 (런타임은)

이 원인은 내 요구 사항을 충족하는 BINARY_VALUE 단말기의 정의이므로 변경 될 수 없습니다.

감사

편집 내가 솔루션은 생산 binary_attribute 일치 할 때 중지 나 수동으로 AST 노드를 채울 수 있도록 그것을 말하는 것입니다 가정

(socket.recv를 통해())하지만, 어떻게 그럴 수 있습니까?

편집 2

Base64로 인코딩 또는 유사한 옵션을 선택하지 않습니다.

[1] 내가 그것을 테스트 have't, 그래서 실질적으로 작동하는 경우 문법은 당신이 인용 한 것과 같은 간단한 경우 그때, 당신이 생각

+0

더 잘 이해하려면 어떤 종류의 파서 생성기를 사용하고 있습니까? (만약에 어떠한). 난 파이썬에 대해 많이 모르지만 당신이 트위스트 보았다, 당신은 프레임 워크/라이브러리에서 새로운 프로토콜을 구현할 수있을 것 같아요 – LB40

+0

* 파서의 "클래스"보세요 * http://simpleparse.sourceforge.net/ 트위스티드는 흥미롭지 만 내 요구 사항에 맞춰 너무 본격적인 (무거운) 것처럼 보입니다. 어쩌면 다른 프로젝트에 사용하겠습니다. – Flavius

+0

ASCII는 바이너리의 하위 집합이므로 첫 번째 질문은 두 가지를 분리해야하는 이유입니다. –

답변

1

애플리케이션을 휴대하고 신뢰할 수있게하려면 표준 ASCII 문자 만 전달하면됩니다.

서로 다른 컴퓨터 아키텍처는 서로 다른 바이너리 표현, 다양한 단어 크기, 다른 문자 집합을 갖습니다. 이 문제를 처리하는 데는 세 가지 방법이 있습니다.

먼저이 문제를 무시하고 단일 paltform에서만 프로토콜을 구현해야합니다.

두 가지 모두 가능한 모든 데이터 유형 ala CORBA에 대해 "기본적인 형식"을 제시 할 수 있습니다.

"sprintf"및 "scanf"의 마법을 사용하여 네트워크를 통해 데이터를 보낼 때 일반 ASCII 문자와 데이터를 변환 할 수 있습니다.

또한 프로토콜에 메시지의 시작 부분 또는 그 근처에 메시지 길이가 포함될 것을 제안합니다. 가정에서 만든 프로토콜의 가장 일반적인 버그는 전송 된 것보다 더 많은 데이터를 예상하는 수신 파트너가 결코 전송되지 않은 데이터를 영원히 기다리는 것입니다.

4

을 얻을에만있어, 모르는 아마 파서 생성기를 사용하는 것이 과잉인가? 직접 재귀 파서를 손으로 돌리는 것이 더 쉽고 빠르다는 것을 알 수 있습니다.

0

이진 데이터를 구문 분석 할 때 construct 라이브러리를 사용하는 것이 좋습니다. 또한 텍스트 (ASCII)를 지원하므로 텍스트를 감지하면이를 SimpleParse 기반 파서에 전달할 수 있지만 이진 데이터는 구문 분석됩니다. 매우 편리하고 강력합니다.