曾经研究跨度,记忆力等。我正在尝试了解从Span中获取整数的预期方法
在我读过的所有博客文章中,都暗示着正在实施一种NonPortableCast<T>
方法,但是看来该方法已被删除。
我也读到了有关它可能在Marc Gravell的一篇文章中重命名为.Cast<T>
的信息,但同样,我在任何地方都找不到它。
所以给定了:
public ReadOnlySpan<byte> MessageBytes {get;set;}
public ReadOnlySpan<byte> ItemLengthBytes => MessageBytes.Slice(0,4);
如何将这4个字节转换为整数?
我现在正在做什么,这是正确的方法吗?还是有更快的方法?
public int ItemLength => Convert.ToInt32(ItemLengthBytes.ToArray());
答案 0 :(得分:5)
在最近的几位中,Cast
方法现在位于System.Runtime.InteropServices.MemoryMarshal
下,如下所示:https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.memorymarshal.cast?view=netcore-2.2#System_Runtime_InteropServices_MemoryMarshal_Cast__2_System_ReadOnlySpan___0__
但是,如果您打算读取单个int,则可能希望使用相同类型的'Read'方法: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.memorymarshal.read?view=netcore-2.2
例如:
public int ItemLength => MemoryMarshal.Read<int>(ItemLengthBytes);
您编写的内容也可以使用,但是会失去Span的许多性能优势,因为每次使用ToArray()
时,您都会进行额外的内存复制和堆分配。