문제

Python의 기본 네트워킹 프로토콜을 작업 중이며 ASCII 문자열 (읽기 : EOL 종료) 및 이진 데이터를 모두 전송할 수 있어야합니다. 후자가 가능하기 위해, 나는 이진이 될 바이트의 수를 포함하도록 문법을 만들기로 선택했다.

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] 테스트를 거치지 않았으므로 실제로 작동하는지 모르겠습니다. 아이디어를 얻는 것이 좋습니다.

도움이 되었습니까?

해결책

응용 프로그램을 휴대용 및 신뢰할 수 있으려면 표준 ASCII 문자 만 와이어를 통과하는 것이 좋습니다.

다른 컴퓨터 아키텍처마다 다른 바이너리 표현, 다른 단어 크기, 다른 문자 세트가 있습니다. 이것을 다루는 데 세 가지 접근법이 있습니다.

먼저 문제를 무시하고 단일 paltform에서 프로토콜을 구현하기 만하면됩니다.

둘 다 당신은 모든 컴퓨터 과학을 가고 가능한 각 데이터 유형 ALA CORBA에 대해 "추기경 양식"을 제시 할 수 있습니다.

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

또한 귀하의 프로토콜에 메시지 시작 또는 그 근처에 메시지 길이가 포함되어 있다고 제안합니다. 홈 메이저 프로토콜에서 가장 일반적인 버그는 수신 파트너가 전송 된 것보다 더 많은 데이터를 기대하고 전송되지 않은 데이터를 영원히 대기하는 것입니다.

다른 팁

문법이 당신이 인용 한 것만 큼 간단하다면, 아마도 파서 생성기를 사용하는 것일 수 있습니까? 손으로 자신의 재귀 파서를 굴리는 것이 더 간단하고 빠를 수 있습니다.

사용하는 것이 좋습니다 건설하다 이진 데이터를 구문 분석하기위한 라이브러리. 또한 텍스트 (ASCII)를 지원하므로 텍스트를 감지 할 때 간단한 파서 기반 구식 구식으로 전달할 수 있지만 바이너리 데이터는 구성과 구문 분석됩니다. 매우 편리하고 강력합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top