본문 바로가기
개발언어/C#

[c#] [C++] --> [C#] 구조체, 클래스 컨버팅

by 창용이랑 2020. 11. 4.
728x90

c++ 서버, c# 클라 Unity 기준입니다.

 

C++

#pragma once

#pragma pack(push,1) // 1바이트 정렬

struct MyStruct
{
        MyStruct()
        {
			m_AccountUniqueID  = 0;
            m_CharacterUniqueID  = 0;

			memset(m_sz, 0, sizeof(m_sz));
            m_b = false;
        }

        char          	m_sz[128];
        unsigned int    m_un1;
        unsigned int    m_un2;

        bool            m_b;
};
 
#pragma pack(pop) // 1바이트 정렬끝?

 

대충 이런 구조체가 있다 치면 C# 으로 컨버팅 할때 이것저것 많이 해야된다;;;;;

 

C#

using System;
using System.Runtime.InteropServices; 

// 1바이트 정렬... c#은 각 구조체, 클래스마다 다 해줘야된다
[StructLayout(LayoutKind.Sequential, Pack = 1)]                                                                     
public class MyStruct                      // 여기선 class 선언 class와 struct 차이는 아래..
{
       MyStruct()
      {
             m_AccountUniqueID = 0;
             m_CharacterUniqueID = 0;

             m_b = false;
      }

      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] // 배열의 크기를 정한다

      public sbyte[]            m_sz;                    // char는 2byte라서 1byte짜리 sbyte를 사용한다. 
      public uint                 m_un1;
      public uint                 m_un2;

      public byte                m_b;
}

대충 위에 처럼 이런식이 되겠다..

 

위에 줄 부터 설명 하자면..

 

앞이 C++ 

sturct MyStruct   --->  

public class MyStruct

 

c++에서의 class 와 struct의 차이점은 선언 디폴트 값이 private냐 public 이냐 이거외의 차이점은 없다...

c#에서의 차이점은 나중에 값을 대입 했을때 깊은 복사( 구조체 ) 냐 얕은 복사( 클래스 ) 냐의 차이점이 있다...

여기선 클래스로 선언..

 

char m_sz[128] --- >

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public sbyte[] m_sz;  

 

c++에서 char는 1byte다...   -128 ~ 127

c#에서 char는 2byte다...     U+0000 ~ U+ffff

//c#에서는 char 형이 2byte로 바뀌었습니다 유니코드 멀티바이트등을 다 포함하기 때문에.

 

우선 둘의 크기가 다르기 때문에 c++의 char 크기와 동일한 c#의 sbyte를 사용한다 ( 범위도 동일 )

 

 

unsigned int m_un1; --- >

public uint m_un1;

 

뭐 여기선 별 다를게 없다 unsigned int 대신 uint 라고 적었을뿐... 둘의 크기, 범위 동일하다.

 

 

bool m_b; --->

public byte m_b;

 

마지막으로 이게 좀 그런대... c++의 경우 bool은 1바이트다.... C# Unity의 경우 bool은 4바이트다..

true, false 만 넣는데 왜 그리 용량을 크게 잡은지는 모르겠는데..........

( 일반 c#의 경우 bool은 1바이트라고 한다.. 확인은 안해봤지만;; )

아무튼 bool을 그대로 사용할수 없기 때문에 c++에서 bool을 사용하지 않거나...

c#에서 byte형태로 사용하는게 편할듯 하다.. 굳이 byte가 아니더라도 1바이트 짜리 sbyte같은거라면 상관 없을듯하다.. 어짜피 바이트로 넣어주는거니까;;

 

 

이상 끝~