天天看點

Memcpy, blockcopy的進一步了解

using System;
using System.Runtime.InteropServices;
using System.IO;
namespace tx
{
    struct ST
    {
       public byte c1;
       public float x;
       public int y;
    }
    class Ct
    {
        [DllImport("msvcrt.dll", EntryPoint = "memcpy", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
        public static extern void MemCopy(byte[] dest, byte[] src, int count);//位元組數組到位元組數組的拷貝

        [DllImport("msvcrt.dll", EntryPoint = "memcpy", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
        public static extern void MemCopy(int[] dest, byte[] src, int count);//位元組數組到整形數組的拷貝

        [DllImport("msvcrt.dll", EntryPoint = "memcpy", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
        public unsafe static extern void MemCopy(ref ST dest, byte[] src, int count);//注意隻有結構體能這麼做,class不可以

        [DllImport("msvcrt.dll", EntryPoint = "memcpy", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
        public static extern void MemCopy(ref byte dest, ref byte src, int count);//位元組數組到整形數組的拷貝

        static void Main(string[] args)
        {
            //測試----------------------------------------------
            var ms = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(ms);
            writer.Write((byte)'a');
            writer.Write((byte)'b');
            writer.Write((byte)'c');
            writer.Write((byte)'d');
            writer.Write(10.2f);
            writer.Write((Int32)30); writer.Write((byte)'w');
            writer.Write((byte)'b');
            writer.Write((byte)'c');
            writer.Write((byte)'d');
            writer.Write((float)799);
            writer.Write((Int32)242);
            var len = ms.Length;
            int[] bs = new int[len/4];
            byte[] bss = new byte[len];

            byte[] buf = ms.GetBuffer();
            var ot = new ST();
            ST[] aot = new ST[2];
            Buffer.BlockCopy(buf, 0, bs, 0, (int)ms.Length);
            //Buffer.BlockCopy(buf, 0, aot, 0, (int)ms.Length);//錯誤,blockcopy隻能用于基元數組
            MemCopy(bss, buf, (int)len);
            MemCopy(ref ot, buf, (int)len/2);//注意隻有結構體能這麼做,class不可以
            MemCopy(ref aot[0], buf, (int)len);

            byte[] sub = new byte[4];

        }

    }

}      

轉載于:https://www.cnblogs.com/timeObjserver/p/7044071.html

繼續閱讀