【问题标题】:How do I convert struct System.Byte byte[] to a System.IO.Stream object in C#?如何在 C# 中将 struct System.Byte byte[] 转换为 System.IO.Stream 对象?
【发布时间】:2011-06-11 18:59:58
【问题描述】:

如何在 C# 中将 struct System.Byte byte[] 转换为 System.IO.Stream 对象?

【问题讨论】:

    标签: c# .net arrays stream


    【解决方案1】:

    将字节数组转换为流的最简单方法是使用MemoryStream 类:

    Stream stream = new MemoryStream(byteArray);
    

    【讨论】:

    • 请注意,这种创建流的方式可能并不理想:“此构造函数不会暴露底层流。GetBuffer 会抛出 UnauthorizedAccessException。” msdn.microsoft.com/en-us/library/e55f3s5k.aspx
    • @noocyte 那么理想的方式是什么?
    • 但是如果你想要你的字节数组,你仍然可以使用stream.ToArray()
    • 像这样从字节数组构造流需要什么样的开销?内存使用情况主要是我想知道的。
    • 使用此方法创建的流无法进一步扩展。
    【解决方案2】:

    您正在寻找MemoryStream.Write method

    例如,以下代码会将byte[]数组的内容写入内存流:

    byte[] myByteArray = new byte[10];
    MemoryStream stream = new MemoryStream();
    stream.Write(myByteArray, 0, myByteArray.Length);
    

    或者,您可以基于字节数组create a new,不可调整大小的MemoryStream 对象:

    byte[] myByteArray = new byte[10];
    MemoryStream stream = new MemoryStream(myByteArray);
    

    【讨论】:

    • 这是最好的答案。它简明扼要,涵盖了所有实际应用。仅使用此处所示的基于字节数组的构造函数存在一个问题 - 生成的流无法重新调整大小。
    • 还记得之后重置流:stream.Seek(0, SeekOrigin.Begin);
    • 请注意,第一个选项MemoryStream.Writenew MemoryStream(myByteArray) 消耗更多内存
    • 为什么,确切地说,是@jitbit?自从我做任何 .NET 以来已经 很多 年了,所以如果我要更新这个答案来评论性能,我需要更多信息。
    • 默认情况下,MemoryStream 缓冲区中分配了额外的空间(就像列表一样)。这可以通过使用允许您设置容量的重载轻松处理,但只有在您不希望将任何数据写入流(或者如果您知道您可能需要多少额外字节时)才真正有用)。但我怀疑 jitbit 可能指的是当您使用 byte[] 构造函数时,不会复制数组 - MemoryStream 指的是参数中的数组。这可能是好的也可能是坏的,有点遗憾的是它没有在 MSDN 上记录:)
    【解决方案3】:

    写入任何流(不仅是MemoryStream)的一般方法是使用BinaryWriter

    static void Write(Stream s, Byte[] bytes)
    {
        using (var writer = new BinaryWriter(s))
        {
            writer.Write(bytes);
        }
    }
    

    【讨论】:

      【解决方案4】:

      查看MemoryStream 类。

      【讨论】:

        【解决方案5】:

        如果您在此处的其他 MemoryStream 示例中遇到错误,则需要将 Position 设置为 0。

        public static Stream ToStream(this bytes[] bytes) 
        {
            return new MemoryStream(bytes) 
            {
                Position = 0
            };
        }
        

        【讨论】:

          猜你喜欢
          • 2013-05-20
          • 2012-07-01
          • 1970-01-01
          • 2017-12-09
          • 1970-01-01
          • 2013-04-14
          • 1970-01-01
          • 2019-05-15
          • 1970-01-01
          相关资源
          最近更新 更多