How to make these structural functions generalized?

I have two functions that read a stream into a buffer and load it into a given structure.

TestStruct1 ReadRecFromStream2(Stream stream) { byte[] buffer = new byte[Marshal.SizeOf(typeof(TestStruct1))]; stream.Read(buffer, 0, 128); GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); try { return (TestStruct1)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(TestStruct1)); } finally { handle.Free(); } } TestStruct2 ReadRecFromStream(Stream stream) { byte[] buffer = new byte[Marshal.SizeOf(typeof(TestStruct2))]; stream.Read(buffer, 0, 128); GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); try { return (TestStruct2)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(TestStruct2)); } finally { handle.Free(); } } 

I would like to combine them into a common function to take any of the structures, I'm just not sure the right way to do this.

Is it correct?

  private T ReadRecFromStream<T>(Stream stream) { byte[] buffer = new byte[Marshal.SizeOf(typeof(T))]; stream.Read(buffer, 0, HeaderSize); GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); try { return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); } finally { handle.Free(); } } 
+5
source share
1 answer

Perhaps you can use these methods to convert from and to byte []:

 public static unsafe byte[] ToBytes<T>(this T value) where T : struct { var result = new byte[Marshal.SizeOf(typeof(T))]; fixed (byte* b = &result[0]) { var p = new IntPtr(b); Marshal.StructureToPtr(value, p, false); } return result; } public static unsafe T FromBytes<T>(this byte[] bytes, int startIndex = 0) where T : struct { fixed (byte* b = &bytes[startIndex]) { var p = new IntPtr(b); return (T)Marshal.PtrToStructure(p, typeof(T)); } } 

Using this, your methods can be changed to:

 T ReadRecFromStream<T>(Stream stream) where T : struct { byte[] buffer = new byte[Marshal.SizeOf(typeof(T))]; stream.Read(buffer, 0, buffer.Length); return buffer.FromBytes<T>() } 

Reading will work similarly.

+2
source

Source: https://habr.com/ru/post/1245705/


All Articles