c# - Buffer.MemoryCopy pre .NET 4.6 的最佳替代品
问题描述
我正在尝试将一些 .NET 4.6 代码降级为 .NET 4.5。
这是我目前正在使用的代码块:
fixed (byte* destination = dataBytes)
{
Buffer.MemoryCopy(data, destination, dataLength, dataLength);
}
data
是byte*
类型,所以我不知道是否Buffer.BlockCopy()
是一个合理的替代品,因为它需要数组。
有任何想法吗?
解决方案
您是对的,Buffer.MemoryCopy
即 .Net 4.6 或更高版本,Buffer.BlockCopy
没有所需的重载,也不存在Array.Copy
问题。
您可以使用以下内容,但它会很慢
fixed (byte* pSource = source, pTarget = target)
for (int i = 0; i < count; i++)
pTarget[targetOffset + i] = pSource[sourceOffset + i];
如果一切都失败了,您可以从 msvcrt.dll pinvoke memcpy
[DllImport("msvcrt.dll", EntryPoint = "memcpy", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
public static extern IntPtr memcpy(IntPtr dest, IntPtr src, UIntPtr count);
同样对于 .Net 4.5,您可以使用System.Runtime.CompilerServices.Unsafe
CopyBlock(Void*, Void*, UInt32)
将指定为长整数值的多个字节从内存中的一个地址复制到另一个地址。
最后,Marshal.Copy
如果您不介意以数组结尾,则可以使用。但是它没有指向指针重载的指针。
将数据从托管数组复制到非托管内存指针,或从非托管内存指针复制到托管数组。
推荐阅读
- javascript - react-highcharts-官方懒加载数据
- c++ - 打印时字符串的每个第一个字符都有空格
- android - 如何在android数据绑定中将常量传递给onClick侦听器
- css - CSS 网格间距
- rxjs - 为什么switchMap在返回简单数组时不需要observable
- php - Horde Gmail OAuth2 身份验证失败
- r - 工具 subset_taxa 的错误代码;dimnames(x) <- dn 中的错误:“dimnames”[1] 的长度不等于数组范围
- c# - 在不使用 AuthorizeAttribute 的情况下将 AuthorizationPolicy 绑定到 Controller/Action
- r - LOCF 插补以及如何填写缺失的条目
- webpack - 观看时如何告诉 webpack 将包放在特定文件夹中?