Cách tốt nhất để điền vào một cấu trúc C # từ một mảng byte [] trong đó dữ liệu từ một cấu trúc C / C ++ là gì? Cấu trúc C sẽ trông giống như thế này (C của tôi rất gỉ):
typedef OldStuff {
CHAR Name[8];
UInt32 User;
CHAR Location[8];
UInt32 TimeStamp;
UInt32 Sequence;
CHAR Tracking[16];
CHAR Filler[12];
}
Và sẽ điền một cái gì đó như thế này:
[StructLayout(LayoutKind.Explicit, Size = 56, Pack = 1)]
public struct NewStuff
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
[FieldOffset(0)]
public string Name;
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(8)]
public uint User;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
[FieldOffset(12)]
public string Location;
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(20)]
public uint TimeStamp;
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(24)]
public uint Sequence;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
[FieldOffset(28)]
public string Tracking;
}
Cách tốt nhất để sao chép OldStuff
vào NewStuff
, nếu OldStuff
được chuyển dưới dạng mảng byte []?
Tôi hiện đang làm một cái gì đó như sau, nhưng nó cảm thấy hơi rắc rối.
GCHandle handle;
NewStuff MyStuff;
int BufferSize = Marshal.SizeOf(typeof(NewStuff));
byte[] buff = new byte[BufferSize];
Array.Copy(SomeByteArray, 0, buff, 0, BufferSize);
handle = GCHandle.Alloc(buff, GCHandleType.Pinned);
MyStuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff));
handle.Free();
Có cách nào tốt hơn để thực hiện điều này không?
Việc sử dụng BinaryReader
lớp có mang lại bất kỳ lợi ích nào về hiệu suất khi ghim bộ nhớ và sử dụng Marshal.PtrStructure
không?