Найдено результатов: 1

Чтение структуры данных C/C++ в C# из байтового массива

Как лучше всего заполнить структуру C# из массива byte[], где данные были получены из структуры C/C++? Структура C будет выглядеть примерно так (мой C очень ржавый):

typedef OldStuff {
    CHAR Name[8];
    UInt32 User;
    CHAR Location[8];
    UInt32 TimeStamp;
    UInt32 Sequence;
    CHAR Tracking[16];
    CHAR Filler[12];
}

И наполнил бы что-то вроде этого:

[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;
}

Что является лучшим способом, чтобы скопировать OldStuff до NewStuff , OldStuff , если передается массив byte[]?

В настоящее время я делаю что-то вроде следующего, но это кажется немного неуклюжим.

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();

Есть ли лучший способ сделать это?


Может ли использование класса BinaryReader обеспечить какой-либо прирост производительности по сравнению с закреплением памяти и использованием Marshal.PtrStructure ?

c#   .net   data-structures   marshalling    

531   5   16:03, 1st July, 2020