검색결과 리스트
struct to byte[]에 해당되는 글 1건
- 2009.03.21 [C#] C#의 클래스(혹은 구조체)를 byte[]로 변환하는 방법 (3)
C#으로 클라이언트나 서버를 만들 때 C++에 비해서 가장 아쉬운 것이 클래스(혹은 구조체)를 byte[](C++로 보면 char* 입니다)로 바로 변환하지 못 한다는 것입니다.
클래스를 바로 byte[]로 변환만 할 수 있으면(혹은 반대로) 네트웍으로 받은 데이터를 처리
하는 것이 간단해지는데 C#으로는 그것이 쉽지 않아서 좀 피곤하기도 합니다.
처음에는 어떻게든 변환 해보려고 했는데 막상 해보니 이것도 나름 피곤하고 성능 상으로 좋지도 않아서 지금은 이 방법은 사용하지 않습니다.
아래는 클래스를 byte[]로 변환하는 코드입니다.
이 방법은 데브피아에서 찾았습니다.
// 패킷 헤더 클래스
[StructLayout(LayoutKind.Sequential)]//[StructLayout(LayoutKind.Sequential, Pack=1)]
public class HEADER
{
public ushort a1;
public ushort a2;
public ushort a3;
public ushort a4;
}
// 로그인 요청 클래스
// GetBuffer을 부모 클래스에서 정의하고 여기서는 상속 받지 않은 이유는 그렇게 하면 클래스의
// 데이타를 복사 할 때 부모클래스의 크기(4바이트) 만큼을 앞에 계산 해버린다
[StructLayout(LayoutKind.Sequential)]
public class LoginAuthorRet
{
public LoginAuthorRet()
{
Header = new HEADER();
acID = new byte[21];
acPasswd = new byte[31];
}
// 클래스의 있는 데이타를 메모리에 담아서 리턴 한다.
public void GetBuffer( byte[] outBuffer )
{
if( 0 == outBuffer.Length )
outBuffer = new byte[ MAX_PACKET_DATA ];
unsafe
{
fixed(byte* fixed_buffer = outBuffer)
{
Marshal.StructureToPtr(this, (IntPtr)fixed_buffer, false);
}
}
}
public HEADER Header; // 헤더
[MarshalAs(UnmanagedType.ByValArray, SizeConst=21)] public byte[] acID; // 아이디
[MarshalAs(UnmanagedType.ByValArray, SizeConst=31)] public byte[] acPasswd; // 패스워드
}
사용 예
byte[] packet1 = new byte[ MAX_PACKET_DATA ];
LoginPacket.GetBuffer( packet1 );
SendPacket( packet1, Marshal.SizeOf(LoginPacket) );
2. byte[] to struct
출처: http://qiita.com/maenotti_99/items/519047bee9fd19e6cb10
구조체
[StructLayout( LayoutKind.Sequential, Pack = 1 )]
public struct Hoge
{
/// <summary> 6:コード</summary>
[MarshalAs( UnmanagedType.ByValArray, SizeConst = 6 )]
public byte[] Code;
}
변환 함수
static public object ToStr( byte[] byteData, Type type )
{
GCHandle gch = GCHandle.Alloc( byteData, GCHandleType.Pinned );
object result = Marshal.PtrToStructure( gch.AddrOfPinnedObject(), type );
gch.Free();
return result;
}
사용 방법
Hoge dataL = (Hoge)ToStr( byData, typeof( Hoge ) );
3. struct to byte[]
출처: http://qiita.com/yu_ka1984/items/969728290b05e15f07a9
댓글
안녕하세요.
저도 패킷을 송신하는데에 byte변환에 머리를 싸매고 있습니다.
이 글에서 쓰신 방법말고 어떤 방법을 쓰시는지 궁금합니다.
지금은 패킷 구조체를 정의하면 툴을 사용하여 byte 배열에 인코딩/디코딩 하는 코드를 생성하는 방식을 사용합니다.
혹은 패킷수가 적고 데이터크기 조금 늘어도 된다면 패킷 데이터를 json 포맷으로 만든후 이것을 byte배열로 바꾸어서 보냅니다.
헉...
제겐 너무 어려운 방식이네요..ㅠㅠ..
더 노력해야겠습니다.
다른 방식으로 변환을 했는데, 홍배님이 말하신 방법은 생각지도 못했네요....