2013-11-04 1 views
5

C#에서 다음 상황을 처리하는 가장 좋은 방법은 무엇입니까?C# Array.Value는 C++에서 만들어진 배열과 다릅니다

C/C++로 작성된 서버 응용 프로그램이 있습니다.

예 : 길이가 256unsigned char 버퍼를 만듭니다. 이 버퍼에서 서버는 클라이언트가 보내는 데이터를 저장합니다. 저장 후, 수신 된 버퍼와 함께 일부 암호화 검사가 있습니다.

저는이 서버의 클라이언트를 C#으로 작성하고 있습니다. I는 콘텐츠 암호화 및 검사가 실패 (256)의 전체 길이와 byte[] 배열을 만들 때

문제는 서버 (256)

의 고정 길이로 예상되는 버퍼이다.

내가 알아 낸 이유는 간단합니다. 서버는 256 바이트 길이의 버퍼를 예상합니다. 예를 들어 메시지가 "Hello World" 인 경우 나머지 버퍼는 0으로 채워야합니다. 또는 더 자세히 설명 : 바이트는 (unsigned) "204" 또는 (signed) "-52"이어야합니다.

저는 이것이 C/C++ 개념 문제/문제라고 생각합니다.

내 문제를 해결하기 위해이 값을 명시 적으로 설정하고 있습니다.

public static byte[] GetCBuffer(this byte[] data, int len) 
{ 
    byte[] tmp = new byte[len]; 
    for(int i = 0; i < len; i++) 
     if(i < data.Length) 
      tmp[i] = data[i]; 
     else 
      tmp[i] = 204; 
    return tmp; 
} 

이러한 예상 바이트로 작업하는 더 좋은 방법이 있습니까? 나는 필수적인 것을 보지 못했습니까?

+0

바이트 배열을 특정 값으로 초기화하려면이 [대답] (http://stackoverflow.com/a/6150310/2145211)을 기반으로 기본 null이 아닌 _ _ 나는 당신의 솔루션이 좋은 것이라고 말할 것입니다 . – Harrison

+0

값을 더 일반화하고 "blank"값을 전달하므로 값이 204가 아닌 다른 값이면 다시 재사용 할 수 있습니다. –

답변

2

당신은 당신의 코드에서 if을 좋아하지 않는 경우에, 당신은 LINQ를 시도 할 수 있습니다.

+0

또한 루프를 Zip으로 바꾸고 ToArray를 반환 할 수 있습니다. – Magus

1

전체 배열을 원하는 채우기 문자로 'memset'한 다음 실제 데이터를 삽입 할 수 있습니까? 단지 보이는 (틀림없이) 조금 더 좋은,

public static byte[] GetCBuffer(this byte[] data, int len) 
{ 
    byte[] tmp = Enumerable.Repeat((byte)204, len).ToArray(); 
    for(int i = 0; i < data.Length; i++) 
    { 
     tmp[i] = data[i]; 
    } 

    return ret; 
} 

을하지만 개념적으로는 동일합니다 :

+1

더 읽기 쉬운 결과처럼 들리 겠지만 "Buffer.BlockCopy" 그것을 지우고. –

+0

아이디어를 지정할 수 있습니까? pinvoke 오버 헤드없이 memset을 구현하는 방법? 사실, 전에 trye'd BlockCopy 전에. 그러나 0보다 채워진 요소는 채워집니다. 요소가 처리 될 때 서버 측에서 위그가 실패합니다. – OnkelM

+0

귀하의 게시물에 다음과 같이 명시되어 있습니다. "C/C++로 작성된 서버 응용 프로그램이 있습니다 ... 길이가 256 인 부호없는 char 버퍼가 생성됩니다." 그래서 C/C++라고 가정하고 배열을 만들 때해야했습니다. –

관련 문제