Структурируйте его в представление ReadOnlyMemory <byte> - PullRequest
0 голосов
/ 16 октября 2018

У меня есть следующая структура:

[StructLayout(LayoutKind.Sequential)]
struct Message
{
     int Header;
     int Data;
}

, и я хочу отправить ее по проводной линии без вызова (используя SendAsync(ReadOnlyMemory<byte>)).

Как получить Memory<byte> из данной структуры?

Я закончил с Span<byte>, а затем застрял.

var message = new Message {
  Header = 1, Data = 3
};
var bytes = MemoryMarshal.AsBytes(
    MemoryMarshal.CreateReadOnlySpan(ref message, 1)
);

Есть ли способ, как поместить структуру непосредственно в поток без каких-либо выделений?

Я нахожусь на netcoreapp2.1.

1 Ответ

0 голосов
/ 16 октября 2018

Что-то вроде:

Span<Message> valSpan = stackalloc Message[1];
valSpan[0] = new Message { Header = 123, Data = 456 };
Span<byte> bytes = MemoryMarshal.Cast<Message, byte>(valSpan); // has length 8

Обратите внимание, что я использую Span<T> здесь.При необходимости вы можете делать в основном то же самое с Memory<T>, но вам нужен резервный массив или аналогичный, который обычно требует выделения - если не массива, то пользовательского MemoryManager<T>:

var arr = new Message[1];
arr[0] = new Message { Header = 123, Data = 456 };
Memory<byte> bytes = MemoryMarshal.Cast<Message, byte>(arr); // has length 8

По сути, вы здесь очень близки:

MemoryMarshal.CreateReadOnlySpan(ref message, 1)

Хитрость заключается в том, чтобы использовать MemoryMarshal.Cast<TFrom, byte>(...) для получения диапазона байтов.

...