我有以下结构:
[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
上。
答案 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>(...)
获得一个字节范围。