2012-07-10 2 views
0

를 저장하는 방법 내가 바이너리 직렬화 네트워크 패킷을 수신하는 프로그램이 있습니다. 현재 포인터를 사용하여 바이트 배열에서 구조체로 직접 데이터를 저장하는 방법이 있습니다. 하지만 지금 필요한 것은 바이트 배열에서 복사하는 쉬운 방법을 유지하면서 UTF 문자열을 구조체에 저장하는 방법입니다. 문자열에는 문자열의 길이 (바이트)를 나타내는 부호없는 short가 접두사로 간주됩니다. 이 C# 내부적으로 char [] 또는 문자열을 저장하는 방법 또는 그것을 저장할 자체 구조체를 만들어야합니까?길이 접두사 문자열

나의 현재 구조체 레이아웃은 다음과 같이이다 :

public struct GenericPacket 
{ 
    public short packetid; 

    public static GenericPacket ReadUsingPointer(byte[] data) 
    { 
     unsafe 
     { 
      fixed (byte* packet = &data[0]) 
      { 
       return *(GenericPacket*)packet; 
      } 
     } 
    } 
} 

읽기 사용하여 포인터는 단순히 바이트 배열을하고 그것에 만 GenericStruct로 포인터를 반환한다. 이것은 모든 일반 유형에 대해 작동하지만 문자열은 더 복잡합니다.

아이디어를 제공해 주셔서 감사합니다.

답변

0
BSTR 형태와 BSTR 방법이 작업 (Win32 및 Win32에서 호환성 라이브러리에서 사용할 수있는) 것입니다

- 당신의 접두사 바이트가 아닌 문자 수를 참조하는 경우, 문자가 여러 바이트 수 있기 때문에, BSTR은 그 중 어떤 것도 모릅니다.

C 문자열은 일반적으로 별도의 길이를 매개 변수로 배열을 사용하지만, C++ 및 C# 1 스트링 구현 정의 된 스토리지를 사용 널 종료없이 접두사이다. 그들은 BSTR이 아닙니다.

+0

따라서, 접두사는 더 뜻 이죠 ... 바이트입니다! – jduncanator

0

넌 문자열

+0

나는 알고 있지만 내가 직접 메모리 위치에 바이트 배열을 매핑하고있어 문자열로 작업을 수행하는 방법을 궁금 해서요. – jduncanator

0

를 리턴 할 System.Text.Encoding.GetString (바이트 []) 또는 System.Text.Encoding.UTF8.GetString (바이트 [])을 사용하여 넌로부터 캐릭터를 구성 할 char [] like

char[] foo = new char[] {'a','b','c','d'} 
string bar = new string(foo); 

큰 배열 블록에서 문자열을 추출하려면 원거리 배열 복사본과 결합하십시오.

System.Text.Encoding.GetString (byte [] data, int start, int length)이 실제로 내부적으로 수행하는 것으로 생각하지만 .NET Micro Framework에서는 이것이 가능하지 않으므로 철자를 써야합니다. .