如何在 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/article/3587751/how-to-use-the-buffer-class-in-c.html
總結
以上是生活随笔為你收集整理的如何在 C# 中使用 Buffer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大学班里80%都去培训班,为什么我没去
- 下一篇: 如何在 C# 中使用 const,rea