How do I convert struct System.Byte byte[] to a System.IO.Stream object in C#?
如何将C中的结构System.Bytebyte[]转换为System.IO.Stream对象?
将字节数组转换为流的最简单方法是使用MemoryStream类:
1
| Stream stream = new MemoryStream (byteArray ); |
- 请注意,这种创建流的方法可能不理想:"此构造函数不公开底层流。GetBuffer引发UnauthorizedAccessException。"msdn.microsoft.com/en-us/library/e55f3s5k.aspx
- @努赛特,那么理想的方法是什么?
- 但是,如果希望返回字节数组,您仍然可以使用stream.ToArray()。
- 像这样从字节数组构造流的开销是什么?内存使用率是我最想知道的。
你在找MemoryStream.Write方法。例如,以下代码将byte[]数组的内容写入内存流:
1 2 3
| byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream ();
stream .Write(myByteArray, 0, myByteArray .Length); |
或者,可以基于字节数组创建一个新的、不可调整大小的MemoryStream对象:
1 2
| byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream (myByteArray ); |
- 这是最好的答案。它简洁,涵盖了所有的实际应用。这里有一个只使用基于字节数组的构造函数的gotcha——结果流不可重新调整大小。
- 还记得在之后重置流:stream.seek(0,seekOrigin.begin);
- 请注意,第一个选项MemoryStream.Write比new MemoryStream(myByteArray)消耗更多的内存。
- 为什么是@jitbit?我已经很多年没有做过任何.NET了,所以如果我要更新这个答案来评论性能,我需要更多的信息。
- 默认情况下,MemoryStream缓冲区中分配了额外的空间(与列表类似)。这可以通过使用允许您设置容量的重载来轻松处理,但只有当您不希望向流中写入任何数据(或者如果您知道可能需要多少额外的字节)时才真正有用。但我怀疑jitbit可能指的是这样一个事实:当使用byte[]构造函数时,数组没有被复制—MemoryStream指的是参数中的数组。这可能是好的也可能是坏的,但遗憾的是没有在msdn上记录下来:)
写入任何流的一般方法(不只是MemoryStream)是使用BinaryWriter:
1 2 3 4 5 6 7
| static void Write (Stream s, Byte[] bytes )
{
using (var writer = new BinaryWriter (s ))
{
writer .Write(bytes );
}
} |
查看MemoryStream类。