첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

728x90
반응형

▶ Marshal 클래스 : 구조체 바이트 배열/객체 구하기 예제

using System.Runtime.InteropServices;

...

/// <summary>
/// 소스 항목
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SourceItem
{
    /// <summary>
    /// 값 1
    /// </summary>
    public int Value1;

    /// <summary>
    /// 값 2
    /// </summary>
    public double Value2;

    /// <summary>
    /// 값 3
    /// </summary>
    public byte Value3;
}

...

SourceItem sourceItem = new SourceItem();

sourceItem.Value1 = 1;
sourceItem.Value2 = 2;
sourceItem.Value3 = 3;

byte[] sourceArray = GetByteArray<SourceItem>(sourceItem);

SourceItem targetItem = GetObject<SourceItem>(sourceArray);

 

▶ Marshal 클래스 : 구조체 바이트 배열/객체 구하기

#region 구조체 바이트 배열 구하기 - GetByteArray<T>(sourceObject)

/// <summary>
/// 구조체 바이트 배열 구하기
/// </summary>
/// <typeparam name="TStruct">구조체 타입</typeparam>
/// <param name="sourceObject">소스 객체</param>
/// <returns>바이트 배열</returns>
public byte[] GetByteArray<TStruct>(TStruct sourceObject) where TStruct : struct
{
    int sourceSize = Marshal.SizeOf(sourceObject);

    IntPtr sourceHandle = Marshal.AllocHGlobal(sourceSize);

    Marshal.StructureToPtr(sourceObject, sourceHandle, false);

    byte[] targetArray = new byte[sourceSize];

    Marshal.Copy(sourceHandle, targetArray, 0, sourceSize);

    Marshal.FreeHGlobal(sourceHandle);

    return targetArray;
}

#endregion
#region 구조체 객체 구하기 - GetObject<TStruct>(sourceByteArray)

/// <summary>
/// 구조체 객체 구하기
/// </summary>
/// <typeparam name="TStruct">구조체 타입</typeparam>
/// <param name="sourceByteArray">소스 바이트 배열</param>
/// <returns>객체</returns>
public TStruct GetObject<TStruct>(byte[] sourceByteArray) where TStruct : struct
{
    IntPtr sourceHandle = Marshal.AllocHGlobal(sourceByteArray.Length);

    Marshal.Copy(sourceByteArray, 0, sourceHandle, sourceByteArray.Length);

    TStruct targetObject = (TStruct)Marshal.PtrToStructure(sourceHandle, typeof(TStruct));

    Marshal.FreeHGlobal(sourceHandle);
 
    if(Marshal.SizeOf(targetObject) != sourceByteArray.Length)
    {
        return default(TStruct);
    }

    return targetObject;
}

#endregion
728x90
반응형
Posted by 사용자 icodebroker
TAG , ,

댓글을 달아 주세요