如何在 C# 中使用 Buffer

緩衝區 是內存中的一組字節序列,緩衝 是用來處理落在內存中的數據,.NET 緩衝 指的是處理 非託管內存 中的數據,用 byte[] 來表示。html

當你想把數據寫入到內存或者你想處理非託管內存中的數據,可使用 .NET 提供的 System.Buffer類,這篇文章就來討論如何使用 Buffer。git

Buffer 下的方法列表

Buffer 類包含了下面幾個方法:github

  • BlockCopy(Array, Int32, Array, Int32)

用於將指定位置開始的 原數組 copy 到 指定位置開始的 目標數組。segmentfault

  • ByteLength(Array)

表示數組中 byte 字節的總數。數組

  • GetByte(Array, Int32)

在數組一個指定位置中提取出一個 byte。性能

  • SetByte(Array, Int32, Byte)

在數組的一個指定位置中設置一個 byte。url

  • MemoryCopy(Void, Void, Int64, Int64)

從第一個源地址上copy 若干個byte 到 目標地址中。spa

理解 Array 和 Buffer

在瞭解 Buffer 以前,咱們先看看 Array 類,Array 類中有一個 Copy() 方法用於將數組的內容 copy 到另外一個數組中,在 Buffer 中也提供了一個相似的 BlockCopy() 方法和 Array.Copy() 作的同樣的事情,不過 Buffer.BlockCopy() 要比 Array.Copy() 的性能高得多,緣由在於前者是按照 byte 拷貝,後者是 content 拷貝。code

數組之間的 bytes copy

你能夠利用 Buffer.BlockCopy() 方法 將源數組的字節 copy 到目標數組,以下代碼所示:htm

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

相關文章
相關標籤/搜索