2017-11-16 1 views
0

가 나는 다음과 같은 형식의 TCP 서버로부터 수신하고있어 사용자 지정 바이너리 프로토콜의 반응을 포함 설명
헤더2 바이트 헤더는 고정 값 16 진수 0x0978입니다.
상태1 바이트 값은 0입니다. 0이 아닌 값은 오류를 나타냅니다. 가능한 각 오류에 대한 자세한 설명은 아래에 설명되어 있습니다.
길이4 바이트 요청의 모든 바이트 클라이언트에서 서버로 전송
데이터가변 0 1,048,576 바이트 데이터 (서버 엔디안 UINT32를 리턴)를 포함한 총 요청 길이
부호 정수를 부호화 할 또는 요구 된 동작에 따라 디코딩 될 수있다.
체크섬1 바이트 헤더에서 데이터로의 요청 (체크섬 바이트 제외)의 바이트 체크섬입니다.맞춤형 바이트 배열의 크기는

데이터가 가변 크기이므로 스트림에서 응답을 읽는 바이트 배열을 만들 때 어떤 크기인지 알 수 없습니다. 이것을 어떻게 할 수 있습니까?

EDIT : 첫 번째 7 바이트가 최종 바이트 배열의 데이터에도 포함되기를 원합니다.

+0

당신은 항상 루프, 다음 나머지를 읽을 수 있습니다. 스트림 기반 프로토콜의 즐거움. 실제 배열 크기에 관계없이 스트림은 버퍼에 들어갈 수있는 한 바이트 수를 줄 수 있으므로 실제 논리는 관계없이 응답을 단편적으로 읽어야합니다. –

+0

처음으로 7 바이트를 읽습니다. 이제 길이를 알고,이 크기의 배열을 만들고 나머지를 읽습니다. – Evk

+0

해달라고 배열에 처음 7 바이트를 읽어야합니까? 또한 첫 번째 7 바이트를 최종 배열에 포함 시키길 원합니다 –

답변

0

한 가지 가능한 솔루션 : 첫 번째 7 바이트를 읽을 때까지

class Program 
{ 
    private static byte[] data = new byte[8] 
    { 
     // header 
     0, 
     0, 

     // status 
     1, 

     // message size 
     8, 
     0, 
     0, 
     0, 

     // data 
     1 
    }; 

    static byte[] Read(Stream stream) 
    { 
     const int headerLength = 7; 
     const int sizePosition = 3; 

     var buffer = new byte[headerLength]; 
     stream.Read(buffer, 0, headerLength); 

     // for BitConverter to work 
     // the order of bytes in the array must 
     // reflect the endianness of the computer system's architecture 
     var size = BitConverter.ToUInt32(buffer, sizePosition); 

     var result = new byte[size]; 
     Array.Copy(buffer, result, headerLength); 
     stream.Read(result, headerLength, (int)size - headerLength); 

     return result; 
    } 

    static void Main(string[] args) 
    { 
     var stream = new MemoryStream(data); 
     byte[] bytes = Read(stream); 

     foreach (var b in bytes) 
     { 
      Console.WriteLine(b); 
     } 
    } 
} 
관련 문제