C# 怎么将ushort数组里面的数据拷贝到IntPtr里面去啊

 我来答
笑引幽
2014-03-29 · TA获得超过393个赞
知道小有建树答主
回答量:257
采纳率:0%
帮助的人:162万
展开全部
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ushort[] uData =  { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//ushort数组
            IntPtr ptr = Marshal.AllocHGlobal(uData.Length * Marshal.SizeOf(typeof(ushort)));//分配内存
            List<byte> bytes = new List<byte>();
            foreach (ushort u in uData)
            {
                bytes.AddRange(BitConverter.GetBytes(u));
            }
            Marshal.Copy(bytes.ToArray(), 0, ptr, bytes.Count);//拷贝




            //读取测试
            byte[] data = new byte[bytes.Count];
            Marshal.Copy(ptr, data, 0, data.Length);//读出来

            ushort[] readData = new ushort[uData.Length];
            for (int i = 0; i < readData.Length; i++)
            {
                //还原数组
                readData[i] = BitConverter.ToUInt16(data, i * Marshal.SizeOf(typeof(ushort)));
                Console.Write(readData[i] + " ");
            }

            Marshal.FreeHGlobal(ptr);//用完以后释放内存

            Console.ReadKey();
        }
    }
}
//使用API
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("kernel32.dll")]
        public static extern void RtlMoveMemory(IntPtr Destination, ushort[] Source, int Length);



        [DllImport("kernel32.dll")]
        public static extern void RtlMoveMemory(ushort[] Destination, IntPtr Source, int Length);

   

        static void Main(string[] args)
        {
            ushort[] uData =  { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//ushort数组
            IntPtr ptr = Marshal.AllocHGlobal(uData.Length * Marshal.SizeOf(typeof(ushort)));//分配内存

            //拷贝
            RtlMoveMemory(ptr, uData, uData.Length * sizeof(ushort));



            //读取测试
           

            ushort[] readData = new ushort[uData.Length];
            //还原
            RtlMoveMemory(readData, ptr, uData.Length * sizeof(ushort));
            for (int i = 0; i < readData.Length; i++)
            {
               
                Console.Write(readData[i] + " ");
            }

            Marshal.FreeHGlobal(ptr);//用完以后释放内存

            Console.ReadKey();
        }
    }
}

仅供参考

百度网友96ffcf7
推荐于2017-09-06 · 知道合伙人互联网行家
百度网友96ffcf7
知道合伙人互联网行家
采纳数:22721 获赞数:118726
从事多年网络方面工作,有丰富的互联网经验。

向TA提问 私信TA
展开全部

对于ushort[],根本无需拷贝,可以直接获取

   public static IntPtr GetPtrFromUShortArray(ushort[] value)
        {
            unsafe
            {
                fixed (ushort* pa = &value[0])
                {
                    return new IntPtr(pa);
                }
            }
        }
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-03-29
展开全部
http://msdn.microsoft.com/zh-cn/library/vstudio/4ca6d5z7(v=vs.100).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
空雪梦见
2014-03-28 · TA获得超过5598个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1213万
展开全部
System.Runtime.InteropServices.Marshal.Copy
更多追问追答
追问
不能拷贝无符号吧的啊
只能拷贝有符号的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式