结构为ReadOnlyMemory <byte>表示形式

时间:2018-10-15 22:02:30

标签: c# .net-core system.memory

我有以下结构:

[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 :(得分:1)

类似的东西:

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>(...)获得一个字节范围。