首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据从IntPtr复制到IntPtr

将数据从IntPtr复制到IntPtr
EN

Stack Overflow用户
提问于 2013-04-13 00:02:35
回答 3查看 28.5K关注 0票数 36

我有两个指向length字节数据区域的IntPtr值。length的数量级可能在200k到400k之间。

代码语言:javascript
复制
int length = /* ..*/
IntPtr ptrSrc = /*.. */;
IntPtr ptrDst = /* .. */;

现在,我想将数据从ptrSrc复制到ptrDst。下面的代码运行良好:

代码语言:javascript
复制
byte[] data = new byte[length];
Marshal.Copy(ptrSrc, data, 0, length);
Marshal.Copy(data, 0, ptrDst, length);

但它的缺点是需要额外的临时(可能很大)数组。不幸的是,我在.NET框架中找不到可以直接从IntPtr复制到IntPtrMarshal.Copy变体,所以我正在寻找替代方案。

我对一个在32位Windows和64位Windows上都能工作的解决方案感兴趣。有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-13 00:10:00

您可以对适当的C函数执行P/Invoke。这可能是最简单的方法。示例:

代码语言:javascript
复制
class Program
{
    [DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
    public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);

    static void Main()
    {
        const int size = 200;
        IntPtr memorySource = Marshal.AllocHGlobal(size);
        IntPtr memoryTarget = Marshal.AllocHGlobal(size);

        CopyMemory(memoryTarget,memorySource,size);
    }
}
票数 45
EN

Stack Overflow用户

发布于 2017-08-04 15:25:11

我认为答案需要在.net 4.6中进行更新

代码语言:javascript
复制
 Buffer.MemoryCopy Method (Void*, Void*, Int64, Int64)

此方法将sourceBytesToCopy字节从源指定的地址复制到目标指定的地址。如果缓冲区重叠且目标减去源之间的差值小于sourceBytesToCopy,则源块将以相反的顺序复制到目标块。

因此,如果你不是在4.6或通用的windows app 10上,那就使用前面的答案。

票数 21
EN

Stack Overflow用户

发布于 2019-01-14 04:31:28

作为user38000527 points out,现代的答案是MemoryCopy,它是.NET核心1.0、.NET标准1.3和.NET框架4.6的一部分。

以下是如何在您的上下文中使用它:

代码语言:javascript
复制
Buffer.MemoryCopy(ptrSrc.ToPointer(), ptrDest.ToPointer(), length, length) 
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15975972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档