//Helper
public class ObjectConverter
{
public static int GetObjectBytesSize<T>()
{
return Marshal.SizeOf(default(T));
}
public static byte[] ObjectToBytes<T>(T obj)
{
int datasize = Marshal.SizeOf(obj);
IntPtr buff = Marshal.AllocHGlobal(datasize);
Marshal.StructureToPtr(obj, buff, true);
byte[] data = new byte[datasize];
Marshal.Copy(buff, data, 0, datasize);
Marshal.FreeHGlobal(buff);
return data;
}
public static T BytesToObject<T>(byte[] data)
{
IntPtr ptr = Marshal.AllocHGlobal(data.Length);
Marshal.Copy(data, 0, ptr, data.Length);
var obj = (T)Marshal.PtrToStructure(ptr, typeof(T));
Marshal.FreeHGlobal(ptr);
if (Marshal.SizeOf(obj) != data.Length)
{
return default(T);
}
return obj;
}
}
//example Class
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class FileMeta
{
#region sigiture 4byte
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
private char[] sigiture = new char[4];
#endregion sigiture
}
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct SMMFData
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string pdtCgr; //128
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string mchnId; //20
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string mchnTp; // 20
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string mchnVdr; //128
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string mchnNm; //128
}
'개발관련 > C#' 카테고리의 다른 글
Dll 리소스 포함해서 exe 배포 (0) | 2017.11.10 |
---|---|
프로그래스바 더블 버퍼링 (0) | 2017.11.09 |
ObjectSerialize (0) | 2017.08.10 |
Aes 암호화/복호화 (0) | 2017.08.10 |
모든 타입 xmlWriter (0) | 2017.08.10 |