乐趣区

关于.net:如何在-C-中使用-Buffer

缓冲区 是内存中的一组字节序列, 缓冲 是用来解决落在内存中的数据,.NET 缓冲 指的是解决 非托管内存 中的数据,用 byte[] 来示意。

当你想把数据写入到内存或者你想解决非托管内存中的数据,能够应用 .NET 提供的 System.Buffer类,这篇文章就来探讨如何应用 Buffer。

Buffer 下的办法列表

Buffer 类蕴含了上面几个办法:

  • BlockCopy(Array, Int32, Array, Int32)

用于将指定地位开始的 原数组 copy 到 指定地位开始的 指标数组。

  • ByteLength(Array)

示意数组中 byte 字节的总数。

  • GetByte(Array, Int32)

在数组一个指定地位中提取出一个 byte。

  • SetByte(Array, Int32, Byte)

在数组的一个指定地位中设置一个 byte。

  • MemoryCopy(Void, Void, Int64, Int64)

从第一个源地址上 copy 若干个 byte 到 指标地址中。

了解 Array 和 Buffer

在理解 Buffer 之前,咱们先看看 Array 类,Array 类中有一个 Copy() 办法用于将数组的内容 copy 到另一个数组中,在 Buffer 中也提供了一个相似的 BlockCopy() 办法和 Array.Copy() 做的一样的事件,不过 Buffer.BlockCopy() 要比 Array.Copy() 的性能高得多,起因在于前者是依照 byte 拷贝,后者是 content 拷贝。

数组之间的 bytes copy

你能够利用 Buffer.BlockCopy() 办法 将源数组的字节 copy 到指标数组,如下代码所示:


static void Main()
{short [] arr1 = new short[] { 1, 2, 3, 4, 5};
  short [] arr2 = new short[10];

  int sourceOffset = 0;
  int destinationOffset = 0;

  int count = 2 * sizeof(short);

  Buffer.BlockCopy(arr1, sourceOffset, arr2, destinationOffset, count);
  for (int i = 0; i < arr2.Length; i++)
  {Console.WriteLine(arr2[i]);
  }
  Console.ReadKey();}

如果没看懂下面输入,我略微解释下吧,请看这句:int count = 2 * sizeof(short) 示意从 arr1 中 copy 4 个字节到 arr2 中,而 4 byte = 2 short,也就是将 arr1 中的 {1,2} copy 到 arr2 中,对吧。

了解数组中字节总长度

要想获取数组中的字节总长度,能够利用 Buffer 中的 ByteLength 办法,如下代码所示:


static void Main()
{short [] arr1 = new short[] { 1, 2, 3, 4, 5};
  short [] arr2 = new short[10];
  Console.WriteLine("The length of the arr1 is: {0}",
  Buffer.ByteLength(arr1));
  Console.WriteLine("The length of the arr2 is: {0}",
  Buffer.ByteLength(arr2));
  Console.ReadKey();}

从图中能够看出, 一个 short 示意 2 个 byte,5 个 short 就是 10 个 byte,对吧,后果就是 short [].length * 2,所以 Console 中的 10 和 20 就不难理解了,接下来看下 Buffer 的 SetByte 和 GetByte 办法,他们可用于独自设置和提取数组中某一个地位的 byte,上面的代码展现了如何应用 SetByte 和 GetByte。


        static void Main()
        {short[] arr1 = {5, 25};

            int length = Buffer.ByteLength(arr1);

            Console.WriteLine("\nThe original array is as follows:-");

            for (int i = 0; i < length; i++)
            {byte b = Buffer.GetByte(arr1, i);
                Console.WriteLine(b);
            }

            Buffer.SetByte(arr1, 0, 100);
            Buffer.SetByte(arr1, 1, 100);

            Console.WriteLine("\nThe modified array is as follows:-");

            for (int i = 0; i < Buffer.ByteLength(arr1); i++)
            {byte b = Buffer.GetByte(arr1, i);
                Console.WriteLine(b);
            }

            Console.ReadKey();}

Buffer 在解决 含有基元类型的一个内存块上 具备超高的解决性能,当你须要解决内存中的数据 或者 心愿疾速的拜访内存中的数据,这时候 Buffer 将是一个十分好的抉择。

译文链接:https://www.infoworld.com/art…

更多高质量干货:参见我的 GitHub: csharptranslate

退出移动版