■ 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

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요