반응형

* 구조체를 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;

        }



    }
}

 

* 실행한 결과...

 

 

반응형

+ Recent posts