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

如何将struct System.Byte[]转换为C#中的System.IO.Stream对象?,c#,.net,arrays,stream,C#,.net,Arrays,Stream,如何将structSystem.ByteByte[]转换为C#中的System.IO.Stream对象?查看类。您正在查找的对象。 例如,以下代码将字节[]数组的内容写入内存流: byte[] myByteArray = new byte[10]; MemoryStream stream = new MemoryStream(); stream.Write(myByteArray, 0, myByteArray.Length); 或者,您可以基于字节数组选择不可调整大小的MemoryStrea

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

查看类。

您正在查找的对象。

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

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream();
stream.Write(myByteArray, 0, myByteArray.Length);
或者,您可以基于字节数组选择不可调整大小的
MemoryStream
对象:

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

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

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

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


如果此处的其他MemoryStream示例出现错误,则需要将位置设置为0

公共静态流到流(此字节[]字节)
{
返回新内存流(字节)
{
位置=0
};
}

这是最好的答案。它简洁明了,涵盖了所有的实际应用。如图所示,仅使用基于字节数组的构造函数存在一个问题——结果流无法重新调整大小。另外,请记住在之后重置流:stream.Seek(0,SeekOrigin.Begin);请注意,第一个选项
MemoryStream.Write
newmemoryStream(myByteArray)
消耗的内存要多得多。确切地说,为什么是@jitbit?我已经很多年没有使用.NET了,所以如果我要更新这个答案来评论性能,我需要更多的信息。默认情况下,
MemoryStream
缓冲区中分配了额外的空间(就像列表一样)。这可以通过使用允许您设置容量的重载轻松解决,但只有在您不希望向流中写入任何数据(或者如果您知道可能需要多少额外字节)时才真正有用。但是我怀疑jitbit可能指的是这样一个事实:当您使用
字节[]
构造函数时,数组没有被复制,
内存流
引用参数中的数组。这可能是好的也可能是坏的,但有点遗憾的是它没有在MSDN上记录:)请注意,这种创建流的方法可能并不理想:“此构造函数不公开底层流。GetBuffer抛出UnauthorizedAccessException。”@noocyte那么理想的方法是什么?但您仍然可以使用
stream.ToArray()
如果您想要返回字节数组,那么从字节数组这样构造流会带来什么样的开销?内存使用率是我最想知道的。用这种方法创建的流不能再花费了。
Stream stream = new MemoryStream(byteArray);