2011-04-27 8 views
1

C++에서 C#으로 단일 char 필드를 포함하는 구조체를 마샬링 할 때 C# 구조체 정의가 어떻게 표시되어야합니까?마샬 struct with char

[StructLayout(LayoutKind.Sequential, Size = 1), Serializable] 
public struct SomeStruct 
{ 
    [MarshalAs(UnmanagedType.I1)] 
    public sbyte Field; 
} 

또는

[StructLayout(LayoutKind.Sequential, Size = 1), Serializable] 
public struct SomeStruct 
{ 
    [MarshalAs(UnmanagedType.U1)] 
    public byte Field; 
} 

나는 그것을 서명 바이트 수 또는 안에 대한 명확한 정보를 찾을 수 없습니다. (이것은 C++ struct 정의에서 'char'으로 선언되었습니다.)

UPD : C++ lib가 GCC 또는 VS (기본 컴파일러 옵션)로 빌드되었는지 여부에 달려 있습니까? 그렇지 않다면 GCC와 VS (기본 컴파일러 옵션) 모두에서 'char'이 서명 되었으면 좋겠습니까

+0

필드가 실제로 문자입니까, 아니면 그냥 char라고 불리는 편리한 8 비트 유형으로 채워져 있습니까? –

+0

C++에서 작은 int를 저장하는 데 사용되었습니다 –

답변

3

일반적으로 char이 C++에서 서명 또는 서명되지 않았 으면 알 수 없습니다. 구현에 따라 다르며, 단일 컴파일러 (구현)는 옵션을 통해 어느쪽으로 든 구성 할 수 있습니다.

가능하면 C 코드에서 명시 적으로 지정하는 것이 가장 좋습니다. 즉, signed char 또는 unsigned char을 사용하십시오. 그런 다음 적절하게 C# 마샬링에 대해 sbyte 또는 byte을 선택할 수 있습니다.

3

Visual Studio 및 GCC에서 charsigned by default입니다. 컴파일러 옵션 /J (GCC의 경우 -funsigned-char)을 사용하여 서명을 해제 할 수 있습니다.

그래서 대답은 해당 옵션이 C++ 프로젝트에서 사용되는지 여부에 따라 달라집니다.

1

대답은 C#에서 값을 저장하는 방법에 따라 달라집니다. 가장 편리한 방법을 선택해야합니다.

  • C# 변수에 부호없는 값으로 저장하면 UnmanagedType.U1으로 마샬링됩니다.
  • C# 변수에 부호있는 값으로 저장하면 UnmanagedType.I1으로 마샬링됩니다.

요점은 바이트가 모듈 경계를 넘으면 그것은 C# 코드의 논리 표현이 아닌 비트 표현이라는 점입니다. 서명되지 않은 값 255는 C++ 코드에 도달하면 -1의 부호있는 값과 같습니다. 물론


, 이것은 당신이 문자 유형으로 char을 사용하고 있다고 가정합니다. 질문에 대한 주석에서 정수형으로 사용하고 있다고 말하면, 서명 여부에 따라 마샬링해야 하는지를 결정해야합니다.

+0

그래, 이해가, 내 대답은 이제 C++ char 사양에 관한 것 같습니다 ... –