2009-10-02 7 views
0

직렬 포트에서 이진 데이터의 스트림을 읽고 입력을 구문 분석하고 형식화해야하는 프로그램을 작성하고 있습니다.정규 표현식 파서에 대한 도움이 필요합니다 - C#

데이터는 지속적으로 읽히며 전체 문자열로 표시되어야합니다. 각 문자열에는 3 바이트의 "시작 코드"와 3 바이트의 "종료 코드"가 있습니다. 시작과 끝 코드를 기반으로 데이터를 찾을 파서를 작성해야합니다. 정규식 파서가이를 수행하는 방법이라고 가정합니다.

마지막 날 또는 2 일 동안 정규 표현식을 읽었지만 클릭 만하지 않습니다. 도움?

시작 코드 : 0 * 16 <는 0x02 (공백으로 구분되지 않습니다) 종료 코드 : 0x03으로>는 0x17 (공백으로 구분되지 않습니다)

는 사람이 값을 찾을 수 정규식을 줄 수 있습니까? 문자열에서 문자열을 제거하지 않고 (예 : String.Split()과 같은 일반 구분 기호를 고려하지 않고) C#에서 찾을 수있는 방법이 있습니까?

답변

0

이 경우에는 정규식이 과도하다고 생각합니다. 나는 그들이 도착할 때마다 데이터 바이트를 버퍼링하고, 각 바이트가 수신 된 후 if가 end 코드로 끝나는 지 확인한다. 대략 이런 식으로 뭔가 (즉석에서 작성, 단지 & 컴파일을 붙여하지 않음) : .NET

Regex
var buffer=new List<byte>(); 
var endCode=new byte[] {3, '>', 0x17}; 

// In a loop: 

byte? received=ReceiveByte(); //Return null if no new byte available 
if(byte.HasValue) { 
    buffer.Add(received); 
    if(buffer.Skip(buffer.Count()-endCode.Length).Take(endCode.Length).SequenceEqual(endCode){ 
    //Process the received data in buffer 
    buffer.Clear(); 
    } 
} 
+0

몇 가지 수정 사항이 포함 된이 아이디어는 훌륭하게 적용되었습니다. 엄청 고마워. – Slim

1

간단한 바이트 일치 값이라면 간단한 유한 상태 머신을 작성하여 시작과 끝을 비교할 수 있습니다. 코드로 테스트하고 표현하기 쉽습니다.

0

유니 코드 문자열을 처리합니다. 이진 데이터 바이트를 처리 할 때 Regex유니 코드에 어떤 형식의 디코딩이 필요합니다. 바이트 배열로 유지되는 데이터는 Regex 사용에 적합하지 않습니다. 정보를 얻으려면 Encoding을 의미있는 것으로 찾거나 정규식 엔진을 잊어 버리십시오.

관련 문제