mirror of
https://github.com/kwsch/PKHeX
synced 2024-12-22 10:23:09 +00:00
47 lines
1.5 KiB
C#
47 lines
1.5 KiB
C#
|
using System;
|
|||
|
using System.Runtime.InteropServices;
|
|||
|
|
|||
|
namespace PKHeX.Core
|
|||
|
{
|
|||
|
internal static class StructConverter
|
|||
|
{
|
|||
|
public static T ToStructure<T>(this byte[] bytes) where T : struct
|
|||
|
{
|
|||
|
var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
|
|||
|
try { return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); }
|
|||
|
finally { handle.Free(); }
|
|||
|
}
|
|||
|
|
|||
|
public static T ToClass<T>(this byte[] bytes) where T : class
|
|||
|
{
|
|||
|
var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
|
|||
|
try { return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); }
|
|||
|
finally { handle.Free(); }
|
|||
|
}
|
|||
|
|
|||
|
public static byte[] ToBytesClass<T>(this T obj) where T : class
|
|||
|
{
|
|||
|
int size = Marshal.SizeOf(obj);
|
|||
|
byte[] arr = new byte[size];
|
|||
|
|
|||
|
IntPtr ptr = Marshal.AllocHGlobal(size);
|
|||
|
Marshal.StructureToPtr(obj, ptr, true);
|
|||
|
Marshal.Copy(ptr, arr, 0, size);
|
|||
|
Marshal.FreeHGlobal(ptr);
|
|||
|
return arr;
|
|||
|
}
|
|||
|
|
|||
|
public static byte[] ToBytes<T>(this T obj) where T : struct
|
|||
|
{
|
|||
|
int size = Marshal.SizeOf(obj);
|
|||
|
byte[] arr = new byte[size];
|
|||
|
|
|||
|
IntPtr ptr = Marshal.AllocHGlobal(size);
|
|||
|
Marshal.StructureToPtr(obj, ptr, true);
|
|||
|
Marshal.Copy(ptr, arr, 0, size);
|
|||
|
Marshal.FreeHGlobal(ptr);
|
|||
|
return arr;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|