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[]
。只是文件不符合要求。