首頁 >後端開發 >C++ >如何有效地將流轉換為.NET中的字節數組?

如何有效地將流轉換為.NET中的字節數組?

DDD
DDD原創
2025-01-31 07:11:08786瀏覽

How to Efficiently Convert a Stream to a Byte Array in .NET?

.NET流到字節數組轉換的最佳實踐

將輸入流轉換為字節數組是編程中常見的任務。有多種方法可以實現此目的,最佳方法取決於具體的用例和可用資源。

使用BinaryReader

在.NET 3.5中,一種常用的方法是使用BinaryReader類,如下面的代碼片段所示:

<code class="language-csharp">Stream s;
byte[] b;

using (BinaryReader br = new BinaryReader(s))
{
    b = br.ReadBytes((int)s.Length);
}</code>

此方法分配一個指定長度的數組,並將流的全部內容讀取到該數組中。但是,它依賴於對流長度的準確了解,而這並不總是可用的。

分塊讀取和寫入

如果流的長度未知或不可靠,則使用循環分塊讀取流可能更高效:

<code class="language-csharp">public static byte[] ReadFully(Stream input)
{
    byte[] buffer = new byte[16 * 1024];
    using (MemoryStream ms = new MemoryStream())
    {
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            ms.Write(buffer, 0, read);
        }
        return ms.ToArray();
    }
}</code>

此方法重複將數據讀取到緩衝區中,直到到達流的末尾。它在返回字節數組之前將數據累積到MemoryStream中。

或者,在.NET 4及更高版本中,可以使用Stream.CopyTo來實現與上述循環相同的結果:

<code class="language-csharp">using (MemoryStream ms = new MemoryStream())
{
    s.CopyTo(ms);
    return ms.ToArray();
}</code>

其他注意事項

這些方法的選擇取決於幾個因素:

  • 流長度的可靠性:如果已知且可靠,則使用BinaryReader可以提高效率。
  • 流大小:如果流很大,則最好使用分塊方法來避免過度使用內存。
  • 性能:在某些情況下,由於減少了內存開銷,分塊方法的性能可能略優於使用BinaryReader。

值得注意的是,Stream.Read不能保證它能夠一次性讀取所有請求的數據。因此,在確保讀取所有數據時,務必使用循環或Stream.CopyTo等替代方法。

以上是如何有效地將流轉換為.NET中的字節數組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn