【问题标题】:How do I read a struct from a Memory<byte>? [duplicate]如何从 Memory<byte> 中读取结构? [复制]
【发布时间】:2019-08-06 21:42:50
【问题描述】:

是否可以在不复制到数组的情况下从Memory&lt;byte&gt; 创建struct?或者更好的是,创建共享相同托管内存的structMemory&lt;byte&gt;

Reading a C/C++ data structure in C# from a byte array 非常接近但不太适用。 Memory&lt;T&gt; 有一个Pin 方法,但它返回一个MemoryHandle 而不是GCHandle

XY:我正在从套接字读取和写入Memory&lt;byte&gt;,在从切片获得的跨度上使用BinaryPrimitives 来获取和设置各个字段。将Memory 表示为struct 会更好。

【问题讨论】:

  • 您可以使用 MemoryMarshall.CastSpan&lt;byte&gt; 转换为 Span&lt;struct&gt; 而无需复制字节 - 至少,我认为这是(非常糟糕的文档)现在的语法。
  • 手动操作内存在 C# 中极为罕见。您通常会尽可能避免使用它,当某个特定接口强制您使用它时,您会立即将其转换为更典型的数据类型以供使用。您似乎违反了这些规范,但您这样做的理由却没有得到很好的解释。特别是,我不明白您为什么不直接将一些byte[] 写入套接字而不是操作内存。也不清楚您实际上是否在进行我提到的转换,这让人想知道 C# 是否是解决您问题的好语言。
  • @jpmc26 我不确定它是否如此不寻常。 .NET Core 开发人员显然决定使用SocketAsyncEventArgs 的首选方法是使用Memory&lt;byte&gt; 而不是byte[] 作为缓冲区。讨论的 API here 存在于 2.2 中,尽管没有记录。事实上,SetBuffer 的几个未记录的重载将它们的参数转换为 Memory&lt;byte&gt; 并设置 MemoryBuffer 属性而不是旧的 Buffer 属性。
  • @jpmc26 一般而言,Memory&lt;byte&gt;Span&lt;byte&gt; 使用起来好多。整个标准 API 似乎都倾向于使用它们而不是 byte[]。只是文档跟不上。

标签: c# struct


【解决方案1】:

.Net Core / .Net Standard 2.1 支持 MemoryMarshal.Cast&lt;TFrom, TTo&gt;Span&lt;TFrom&gt; 进行重新解释转换为 Span&lt;TTo&gt;。您应该能够使用Memory&lt;T&gt;.Span 属性来获取Span,然后将其转换为您的struct

【讨论】:

    猜你喜欢
    • 2020-03-20
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2016-03-07
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多