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

Meh*_*eli 710 .net c# arrays stream

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

Mar*_*erl 1193

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

Stream stream = new MemoryStream(byteArray);
Run Code Online (Sandbox Code Playgroud)

  • @noocyte什么是理想的方式呢? (22认同)
  • 请注意,这种创建流的方式可能并不理想:"此构造函数不会公开底层流.GetBuffer会抛出UnauthorizedAccessException." http://msdn.microsoft.com/en-us/library/e55f3s5k.aspx (19认同)
  • 但如果你想要你的字节数组,你仍然可以使用`stream.ToArray()`. (6认同)
  • 什么样的开销与从这样的字节数组构造流相关联?内存使用情况主要是我想知道的。 (2认同)
  • 使用此方法创建的流不能进一步扩展。 (2认同)

Cod*_*ray 327

你正在寻找这种MemoryStream.Write方法.例如,以下代码将byte[]数组的内容写入内存流:

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream();
stream.Write(myByteArray, 0, myByteArray.Length);
Run Code Online (Sandbox Code Playgroud)

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

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream(myByteArray);
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案.它简洁,涵盖了所有实际应用.如此处所示,只使用基于字节数组的构造函数有一个问题 - 结果流不可重新调整大小. (25认同)
  • 还记得以后重置流:stream.Seek(0,SeekOrigin.Begin); (15认同)
  • 默认情况下,在`MemoryStream` 缓冲区中分配了额外的空间(就像列表一样)。这可以通过使用允许您设置容量的重载轻松解决,但只有在您不希望将任何数据写入流时才真正有用(或者如果您知道可能需要多少额外字节) )。但我怀疑 jitbit 可能指的是当你使用 `byte[]` 构造函数时,数组没有被复制 - `MemoryStream` 指的是参数中的数组。这可能是好的也可能是坏的,有点遗憾它没有在 MSDN 上记录:) (4认同)
  • 请注意,第一个选项“MemoryStream.Write”比“new MemoryStream(myByteArray)”消耗更多内存 (3认同)

Qry*_*taL 29

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

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


Rod*_*ing 8

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

public static Stream ToStream(this bytes[] bytes) 
{
    return new MemoryStream(bytes) 
    {
        Position = 0
    };
}
Run Code Online (Sandbox Code Playgroud)


Cor*_*urn 5

走进MemoryStream班级看看。