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

949
在C#中,如何将结构体System.Byte byte[]转换为System.IO.Stream对象?
6个回答

1610

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

Stream stream = new MemoryStream(byteArray);

22
请注意,这种创建流的方式可能不是最理想的: “此构造函数不公开底层流。 GetBuffer 抛出 UnauthorizedAccessException。” - noocyte
35
什么是理想的方法? - brettwhiteman
10
如果你想要得到字节数组,仍然可以使用 stream.ToArray() - Florian Fida
3
从字节数组构建流涉及哪些开销?我主要关心的是内存使用情况。 - jocull
2
使用此方法创建的流无法进一步扩展。 - Muhammad Saqib

424

你需要使用MemoryStream.Write方法

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

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

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

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

34
这是最好的答案。它简洁明了,涵盖了所有实际应用。但是,仅仅使用基于字节数组的构造函数存在问题,即生成的流不可调整大小。 - Jduv
24
请记得在操作流后重置它: stream.Seek(0, SeekOrigin.Begin); (原意为将流的位置指针移动到起始位置,以便下一次读取或写入时可以重新开始。) - Minh Nguyen
3
请注意,第一个选项MemoryStream.Writenew MemoryStream(myByteArray)消耗更多的内存。 - Alex from Jitbit
1
为什么会这样,@jitbit?我已经很多年没有使用过.NET了,所以如果我要更新这个答案来评论性能,我需要更多的信息。 - Cody Gray
5
默认情况下,在 Memory Stream 缓冲区中分配了额外的空间(就像列表一样)。您可以使用允许设置容量的重载函数轻松处理此问题,但只有在不希望向流写入数据(或者知道需要多少额外字节)时才真正有用。但我怀疑 jitbit 可能指的是当您使用 byte[] 构造函数时,该数组不会被复制 - MemoryStream 引用参数中的数组。这既有好处也有坏处,遗憾的是这一点没有在 MSDN 上记录 :) - Luaan

35

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

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

8

如果你在这里的其他MemoryStream示例中遇到错误,请将Position设置为0。

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

为什么有时候需要将位置设置为零,你知道吗? - TheLegendaryCopyCoder
1
@TheLegendaryCopyCoder,如果你想在获取流后从开头开始阅读它,那么位置0就是开头。 - Stephen Oberauer

5

0
Stream into Byte[]:                                   

MemoryStream memory = (MemoryStream)stream; 

byte[] imageData = memory.ToArray();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接