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


Answers:


1284

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

Stream stream = new MemoryStream(byteArray);

19
请注意,这种创建流的方法可能不是理想的方法:“此构造函数不会公开基础流。GetBuffer会引发UnauthorizedAccessException。” msdn.microsoft.com/en-us/library/e55f3s5k.aspx
noocyte 2013年

25
@noocyte的理想方法是什么?
developerbmw

6
但是stream.ToArray()如果您想让字节数组返回,您仍然可以使用。
弗洛里安·菲达

2
像这样从字节数组构造流会带来什么样的开销?内存使用率是我最想知道的。
jocull

344

您正在寻找MemoryStream.Write方法

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

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);

26
这是最好的答案。简洁明了,涵盖了所有实际应用。只是使用这里指出的基于字节数组的构造函数有一个陷阱-生成的流无法重新调整大小。
Jduv

17
还记得之后要重置流:stream.Seek(0,SeekOrigin.Begin);
Minh Nguyen

请注意,第一种选择MemoryStream.Write是要比后者消耗更多的内存new MemoryStream(myByteArray)
Alex

到底为什么是@jitbit?我做任何.NET 已有很多年了,因此,如果我要更新此答案以评论性能,则需要更多信息。
科迪·格雷

2
MemoryStream默认情况下,缓冲区中分配了额外的空间(就像列表一样)。这可以通过使用允许设置容量的重载轻松解决,但是仅在不希望向流中写入任何数据(或者如果您知道可能需要多少额外的字节)时才真正有用。 )。但是我怀疑jitbit可能指的是以下事实:使用byte[]构造函数时,不会复制数组- MemoryStream引用参数中的数组。这可以是好事也可以是坏事,这有点可惜,MSDN上没有记录它:)
Luaan

32

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.