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

Другое решение состоит в создании ассоциативного массива с форматом даты и последующим переформатированием данных.

Этот метод полезен для даты, отформатированной беспорядочным способом.

Пример:

    mydate='01.02.12 10:20:43':
    myformat='dd/mm/yy HH:MM:ss';


    dtsplit=mydate.split(/[\/ .:]/);
    dfsplit=myformat.split(/[\/ .:]/);

    // creates assoc array for date
    df = new Array();
    for(dc=0;dc<6;dc++) {
            df[dfsplit[dc]]=dtsplit[dc];
            }

    // uses assc array for standard mysql format
    dstring[r] = '20'+df['yy']+'-'+df['mm']+'-'+df['dd'];
    dstring[r] += ' '+df['HH']+':'+df['MM']+':'+df['ss'];
78
задан Markus Safar 7 February 2016 в 01:06
поделиться

3 ответа

Из того, что я вижу в том контексте, Вы не должны копировать SomeByteArray в буфер. Просто необходимо получить дескриптор от SomeByteArray, прикрепить его, скопировать IntPtr данные с помощью PtrToStructure и затем выпустить. Никакая потребность в копии.

, Который был бы:

NewStuff ByteArrayToNewStuff(byte[] bytes)
{
    GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    try
    {
        NewStuff stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff));
    }
    finally
    {
        handle.Free();
    }
    return stuff;
}

Универсальная версия:

T ByteArrayToStructure<T>(byte[] bytes) where T: struct 
{
    T stuff;
    GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    try
    {
        stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
    }
    finally
    {
        handle.Free();
    }
    return stuff;
}

Более простая версия (требует unsafe переключатель):

unsafe T ByteArrayToStructure<T>(byte[] bytes) where T : struct
{
    fixed (byte* ptr = &bytes[0])
    {
        return (T)Marshal.PtrToStructure((IntPtr)ptr, typeof(T));
    }
}
103
ответ дан Ed Plunkett 24 November 2019 в 10:38
поделиться

Не упустите упаковку проблем. В примере Вы дали все поля, при очевидных смещениях, потому что все находится на 4-байтовых границах, но это будет не всегда иметь место. Visual C++ упаковывает на 8-байтовых границах по умолчанию.

4
ответ дан Tim Ring 24 November 2019 в 10:38
поделиться

Если у Вас есть байт [], необходимо быть в состоянии использовать класс BinaryReader и установленные значения на NewStuff с помощью доступных методов ReadX.

0
ответ дан Mufaka 24 November 2019 в 10:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: