2014-12-29 2 views
0

나는 B의왜 char의 저장소 크기가 변경되는 것입니까?

char c = 'A'; 
byte[] b = BitConverter.GetBytes(c); 

길이 내가 상호 운용성을 위해 다음과 같은 구조체가있는 경우

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
struct MyStruct 
{ 
    int i; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] 
    char[] c; 

    public int TheInt 
    { 
     get { return i; } 
     set { i = value; } 
    } 

    public string TheString 
    { 
     get { return new string(c); } 
     set { c = value.ToCharArray(); } 
    } 
} 

다음 할, 그러나 2

이다 할 경우

MyStruct m = new MyStruct(); 
m.TheInt = 10; 
m.TheString = "Balloons"; 

int mSize = Marshal.SizeOf(m); 

MSIZE 내가 예상 한대로 20이 아닌 12 점입니다.

MSDN은 char 저장소가 2 바이트라고 말합니다. 첫 번째 예는 이것을 지원합니다.

구조체에 문제가 있습니까? 내가 빠진 것이 있습니까?

답변

2

마샬링을 사용하고 있기 때문에 기본적으로 char은 유니 코드 char 대신 ANSI char으로 정렬됩니다. 따라서 "풍선"은 ANSI로 인코딩 할 때 8 바이트이고 12 바이트 인 정수 4 바이트를 더한 것입니다.

마샬링을 위해 크기를 20으로 설정하려면 StructLayout을 변경하고 채팅 세트를 유니 코드 : 20

MSDN은 문자 저장이 2 바이트 말한대로

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)] 

지금 당신은 당신의 구조체의 크기를해야합니다.

우리가 CLR char에 대해 말하고 있지만 마샬링 컨텍스트에서는 그렇지 않은 경우에 해당됩니다.

+0

그걸 정렬했습니다! 지금 몇 시간 동안 그것을 괴롭혔다면, CharSet 속성에 대해 생각하지 않았습니다. 구조체에 문자열이 들어있을 때만 사용했습니다. 내 하마를 고쳐 줘서 고마워. – JasonB

0
  • 문자는 2 바이트 또는 16 비트 유니 코드 문자 (U +0000에 U + FFFF)
  • CHAR []
  • INT는 따라서 4 바이트

인 포인터 타입, marshalling에 관해서는, 나는 vcsjones의 답을 고를 것입니다.

관련 문제