gpt4 book ai didi

c# - 结构为 ReadOnlyMemory 表示

转载 作者:行者123 更新时间:2023-11-30 16:39:36 28 4
gpt4 key购买 nike

我有以下结构:

[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 .

最佳答案

类似于:

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>(...) 来获取一段字节。

关于c# - 结构为 ReadOnlyMemory<byte> 表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52825341/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com