C# 如何从内存中读取结构<;字节>;?
是否可以从C# 如何从内存中读取结构<;字节>;?,c#,struct,C#,Struct,是否可以从内存创建结构,而不复制到数组?或者更好的方法是创建一个结构和一个内存,它们共享相同的托管内存 非常接近,但不太适用Memory有一个方法,但它返回一个MemoryHandle而不是GCHandle XY:我正在从套接字读取和写入内存,使用从片中获取的跨度来获取和设置单个字段。将内存表示为结构会更好。.Net Core/.Net Standard 2.1支持对Span进行重新解释转换为Span。您应该能够使用该属性获取Span,然后将其转换为您的struct您可以使用MemoryMars
内存创建结构
,而不复制到数组?或者更好的方法是创建一个结构
和一个内存
,它们共享相同的托管内存
非常接近,但不太适用Memory
有一个方法,但它返回一个MemoryHandle
而不是GCHandle
XY:我正在从套接字读取和写入内存
,使用从片中获取的跨度来获取和设置单个字段。将内存
表示为结构
会更好。.Net Core/.Net Standard 2.1支持对Span
进行重新解释转换为Span
。您应该能够使用该属性获取Span
,然后将其转换为您的struct
您可以使用MemoryMarshall.Cast
将Span
转换为Span
,而无需复制字节-至少,我认为这是(文档记录非常糟糕的)手动操作内存在C#中是极不寻常的。通常,您会尽可能避免使用它,当某个特定接口迫使您使用它时,您会立即将其转换为更典型的数据类型来使用。你似乎违反了这些准则,但你这样做的理由解释得很糟糕。特别是,我不明白为什么不直接将一些byte[]
写入套接字,而不是操作内存。还不清楚您是否真的在进行我提到的转换,这让人怀疑C#是否是解决您问题的好语言。@jpmc26我不确定它是否如此不同寻常。NET核心开发人员显然决定使用SocketAsyncEventArgs
的首选方法是使用内存
而不是字节[]
作为缓冲区。讨论的API存在于2.2中,尽管没有文档记录。事实上,SetBuffer
的一些未记录重载将其参数转换为Memory
,并设置MemoryBuffer
属性,而不是旧的Buffer
属性。@jpmc26一般来说,Memory
和Span
更适合使用。整个标准API似乎更倾向于使用它们而不是byte[]
。只是文件不符合要求。