MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Побайтная запись данных в структуру С#"
Answer 801807
Например, используя Marshal.PtrToStructure:
object ByteArrayToStructure(byte[] bytearray, Type t) { if (t.IsValueType == false) throw new ArgumentException("Type is not structure"); IntPtr p = IntPtr.Zero; object obj = null; try { int len = Marshal.SizeOf(t); p = Marshal.AllocHGlobal(len); Marshal.Copy(bytearray, 0, p, len); obj = Marshal.PtrToStructure(p, t); } finally { if (p != IntPtr.Zero) Marshal.FreeHGlobal(p); } return obj; } /*...*/ byte[] arr = /*Считать массив байт из потока*/; MyStruct s = (MyStruct)ByteArrayToStructure(arr,typeof(MyStruct));
Или как-то так (извращенный способ, но не требует выделения промежуточного блока памяти):
using System; using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct MyStruct { /*Список полей*/ short x; short y; sbyte a; byte b; /*Статические методы*/ [DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)] private static extern void CopyMemory( [In, Out] ref MyStruct dest, [MarshalAs(UnmanagedType.LPArray)] byte[] src, int count); public static MyStruct ByteArrayToStructure(byte[] bytearray) { MyStruct obj = new MyStruct(); CopyMemory(ref obj, bytearray, bytearray.Length); return obj; } } /*...*/ byte[] arr = /*Считать массив байт из потока*/; MyStruct s = MyStruct.ByteArrayToStructure(arr);
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.