2014-11-17 5 views
2

하나 이상의 데이터 프레임을 포함 할 수있는 Byte[] 버퍼가 있습니다. 실제 프레임의 길이를 알기 위해 첫 번째 바이트를 읽어야합니다.F # 배열의 시작과 일치

let extractFrame (buffer:byte[]) = 
    match buffer with 
    | [|head1;head2;head3;..|] when head2 < (byte)128 -> processDataFrame buffer head2 
    | <...others....> 
    | _ -> raise(new System.Exception()) 

는 기본적으로, 처음 세 바이트를 평가 한 후 버퍼와 실제 길이와 processDataFrame를 호출해야합니다

이 내가 뭘 원하는지의 "비 작업"버전입니다 프레임. 헤더에 따라 프레임은 데이터, 컨트롤 등이 될 수 있습니다.

모든 종류의 일치 (목록, 시퀀스, ... 등 ...)로 수행 할 수 있습니까? 아니면 헤더의 길이가 다른 작은 배열을 만들어야합니까? (나는 이것을 피하고 싶습니다).

+0

if/then을 사용하여 처음 세 바이트를 평가하는 것이 더 쉽지 않을까요? –

+0

그게 내가 알아 내려고 노력하고 ... 많은 경우가 있고, 나는 F 에서이 일을하는 올바른 방법을 궁금 해서요. – vtortola

답변

3

당신이 활성 패턴 (http://msdn.microsoft.com/en-us/library/dd233248.aspx) 만들 수 일치 사용하려면 :

let (|Head1|_|) (buffer:byte[]) = 
    if(buffer.[0] (* add condition here *)) then Some buffer.[0] 
    else None 

let (|Head2|_|) (buffer:byte[]) = 
    if(buffer.[1] < (byte)128) then Some buffer.[1] 
    else None 

let extractFrame (buffer:byte[]) = 
    match buffer with 
    | Head1 h1 -> processDataFrame buffer h1 
    | Head2 h2 -> processDataFrame buffer h2 
........ 
    | _ -> raise(new System.Exception()) 
+0

맞아,이 훨씬 더 의미가 있습니다. 감사! – vtortola

3

을 나는이 실제로 일반 if 구조를 사용하여이 작업을 수행하는 것이 더 쉬울 수 있습니다 생각합니다.

Petr에서 언급했듯이 활성 패턴을 사용하고 배열에서 특정 정보를 추출하는 패턴을 정의 할 수 있습니다. 당신이하고있는 일을 모델링하기 위해, 나는 실제로 매개 변수화 된 활성 패턴을 사용할 것입니다 - 당신은 필요한 배열의 요소 수를 줄 수 있습니다. 3 개 요소는 백업 :이 방법의

let (|TakeSlice|_|) count (array:_[]) = 
    if array.Length < count then None 
    else Some(array.[0 .. count-1]) 

let extractFrame (buffer:byte[]) = 
    match buffer with 
    | TakeSlice 3 [|head1;head2;head3|] when head2 < (byte)128 -> 
     processDataFrame buffer head2 
    | <...others....> 
    | _ -> raise(new System.Exception()) 

한 가지 단점은 패턴 [|h1; h2; h3|] 당신이 3을 지정된 길이에 일치해야한다는 것입니다 - 컴파일러는 당신을 위해 이것을 확인할 수 없습니다.

+0

서버 응용 프로그램이고 초당 수천 개를 생성하므로 매번 새 배열을 만들 여유가 없습니다. – vtortola

+0

좀 더 똑똑한 뭔가를 생각해 낼 수있을 것 같아요 .- ArraySegment' :-) –

+0

초당 여전히 수천 개에요. DI는 버퍼, 오프셋, 길이로 작업함으로써 좀 더 편하게 느낍니다. . – vtortola

관련 문제