【问题标题】:Is there a way to convert between byte[] to Stream and back without copying?有没有办法在不复制的情况下在 byte[] 和 Stream 之间进行转换?
【发布时间】:2013-06-20 17:43:52
【问题描述】:

我需要将 byte[] 数组转换为流(例如,用于上传文件),然后在我的代码的另一部分中,将流转换回数组(例如,用于下载文件)。有没有办法在不复制字节数组的情况下进行这些操作?

这段代码显示 MemoryStream 创建副本。我想用安全性换取更好的内存性能。

    static void Main(string[] args)
    {
        byte[] array1 = new byte[1024];

        using (MemoryStream s = new MemoryStream(array1))
        {
            byte[] array2 = s.ToArray();
            Console.WriteLine(Object.ReferenceEquals(array1, array2)); // "false"
        }
    }

【问题讨论】:

  • 您没有显示 MemoryStream 创建副本,您显示了 ToArray() 制作副本。尝试byte[] array1 = new byte[1]; Console.WriteLine(array1[0]); using (MemoryStream s = new MemoryStream(array1)) {s.WriteByte(1);} Console.WriteLine(array1[0]); 它将输出0 然后1
  • 好点 - 它只是 ToArray() 制作副本。

标签: .net memorystream


【解决方案1】:

您可以使用MemoryStream.GetBuffer 来避免复制。请记住,这是“原始”后备缓冲区,它可能比流的名义长度更长。

或者,如果您提供字节数组开始,您也可以在之后使用它:

byte[] buffer = new byte[1024];
using (MemoryStream stream = new MemoryStream(buffer))
{
    // Write to it here
}
// Now buffer will contain the written data

同样,您需要计算出实际写入了多少数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2019-12-30
    • 1970-01-01
    相关资源
    最近更新 更多