Правильный способ получить изменяемую структуру для памяти <byte>/ Span <byte>? - PullRequest
0 голосов
/ 26 мая 2018

Для реализации сетевого протокола я хочу использовать новые классы Memory и Span для достижения нулевой копии буфера при доступе к данным через struct.

У меня естьследующий надуманный пример:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Data
{
    public int IntValue;
    public short ShortValue;
    public byte ByteValue;
}

static void Prepare()
{
    var buffer = new byte[1024];
    var dSpan = MemoryMarshal.Cast<byte, Data>(buffer);
    ref var d = ref dSpan[0];

    d.ByteValue = 1;
    d.ShortValue = (2 << 8) + 3;
    d.IntValue = (4 << 24) + (5 << 16) + (6 << 8) + 7;
}

В результате buffer заполняется 7, 6, 5, 4, 3, 2, 1, что по желанию, но я с трудом могу себе представить, что MemoryMarshal.Cast - единственный способ (за исключением того, что требуетсяключевое слово unsafe).Я попробовал некоторые другие методы, но я не могу понять, как использовать их с ref struct (который не может использоваться в качестве аргумента универсального типа) или как получить структуру, которая находится в реальном буфере, а не в копии(при котором любые сделанные мутации не отражаются в буфере).

Есть ли какой-нибудь более простой способ получить эту изменяемую структуру из буфера?

1 Ответ

0 голосов
/ 29 мая 2018

Уф.Похоже, что MemoryMarshal.Cast - это метод расширения NonPortableCast (из: this commit ), в этом случае - да, это наиболее подходящий способ пролистывания между макетами пролётов, чаще всего (но не исключительно) как в этом случае - между byte и некоторыми struct.

...