반응형
* 구조체를 Marshal 이용 바이트배열로 변환 하거나 바이트 배열화 된 구조체를 다시 원래 모습으로
복귀 시키는 예제...
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace StructAndBytes
{
public partial class Form1 : Form
{
//구조체 선언...
struct t_Test
{
public int iTmp ;
public string strTmp;
public double dbTmp ;
public float ftTmp ;
}
//구조체 변수 선언...
t_Test tt = new t_Test();
byte[] bTmp;
public Form1()
{
InitializeComponent();
//테스트 값 대입...
tt.dbTmp = 0.12321312313;
tt.iTmp = 123123;
tt.strTmp = "테스트1";
tt.ftTmp = 0.123213f;
}
#region 사용자 정의함수...
private byte[] StructToBytes(object obj)
{
//구조체 사이즈
int iSize = Marshal.SizeOf(obj);
//사이즈 만큼 메모리 할당 받기
byte[] arr = new byte[iSize];
IntPtr ptr = Marshal.AllocHGlobal(iSize);
//구조체 주소값 가져오기
Marshal.StructureToPtr(obj, ptr, false);
//메모리 복사
Marshal.Copy(ptr, arr, 0, iSize);
Marshal.FreeHGlobal(ptr);
return arr;
}
private T ByteToStruct<T>(byte[] buffer) where T : struct
{
//구조체 사이즈
int size = Marshal.SizeOf(typeof(T));
if (size > buffer.Length)
{
throw new Exception();
}
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(buffer, 0, ptr, size);
T obj = (T)Marshal.PtrToStructure(ptr, typeof(T));
Marshal.FreeHGlobal(ptr);
return obj;
}
#endregion
//버튼 이벤트...
private void button1_Click(object sender, EventArgs e)
{
bTmp = StructToBytes(tt);
label1.Text = bTmp.Length.ToString() + " bytes";
}
private void button2_Click(object sender, EventArgs e)
{
t_Test tTmp = ByteToStruct<t_Test>(bTmp);
label2.Text = "int 값: " + tTmp.iTmp.ToString();
label3.Text = "double 값: " + tTmp.dbTmp.ToString();
label4.Text = "float 값: " + tTmp.ftTmp.ToString();
label5.Text = "string 값: " + tTmp.strTmp;
}
}
}
* 실행한 결과...
반응형
'C# Programming' 카테고리의 다른 글
[C#] 소스 코드 동적 컴파일 예제 (0) | 2019.09.21 |
---|---|
[C#] 객체 파일 저장 및 불러오기 예제 (Serialization) (0) | 2019.09.19 |
[C#] 크로스 스레드 (Cross Thread) 예제 (0) | 2019.09.15 |
[C#] 인덱서 (Indexer) (0) | 2019.09.14 |
[C#] 델리 게이트 (Delegate) - 2 델리게이트 콜백과 사용 그리고 체인 (0) | 2019.09.12 |