| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.Linq;
 
- using System.Runtime.InteropServices;
 
- using System.Text;
 
- using System.Threading.Tasks;
 
- namespace EPD.Data
 
- {
 
-     public class ByteStructConverter
 
-     {
 
-         public static T ToStruct<T>(byte[] by) where T : struct
 
-         {
 
-             int objectSize = Marshal.SizeOf(typeof(T));
 
-             if (objectSize > by.Length) return default(T);
 
-             // Allocate some unmanaged memory.
 
-             IntPtr buffer = Marshal.AllocHGlobal(objectSize);
 
-             // Copy the read byte array (byte[]) into the unmanaged memory block.
 
-             Marshal.Copy(by, 0, buffer, objectSize);
 
-             // Push the memory into a new struct of type (T).
 
-             T returnStruct = (T)Marshal.PtrToStructure(buffer, typeof(T));
 
-             // Free the unmanaged memory block.
 
-             Marshal.FreeHGlobal(buffer);
 
-             return returnStruct;
 
-         }
 
-         public static object ToStruct(byte[] buffer, Type t)
 
-         {
 
-             int objectSize = Marshal.SizeOf(t);
 
-             if (objectSize > buffer.Length) return null;
 
-             // Allocate some unmanaged memory.
 
-             IntPtr buf = Marshal.AllocHGlobal(objectSize);
 
-             // Copy the read byte array (byte[]) into the unmanaged memory block.
 
-             Marshal.Copy(buffer, 0, buf, objectSize);
 
-             // Push the memory into a new struct of type (T).
 
-             object result = Marshal.PtrToStructure(buf, t);
 
-             // Free the unmanaged memory block.
 
-             Marshal.FreeHGlobal(buf);
 
-             return result;
 
-         }
 
-         public static byte[] Struct2Bytes(object o)
 
-         {
 
-             // create a new byte buffer the size of your struct
 
-             byte[] buffer = new byte[Marshal.SizeOf(o)];
 
-             // pin the buffer so we can copy data into it w/o GC collecting it
 
-             GCHandle bufferHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
 
-             // copy the struct data into the buffer
 
-             Marshal.StructureToPtr(o, bufferHandle.AddrOfPinnedObject(), false);
 
-             // free the GC handle
 
-             bufferHandle.Free();
 
-             return buffer;
 
-         }
 
-     }
 
- }
 
 
  |