ChatGPT解决这个技术问题 Extra ChatGPT

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

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


M
Martin Buberl

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

Stream stream = new MemoryStream(byteArray);

请注意,这种创建流的方式可能并不理想:“此构造函数不会暴露底层流。GetBuffer 会抛出 UnauthorizedAccessException。” msdn.microsoft.com/en-us/library/e55f3s5k.aspx
@noocyte 那么理想的方法是什么?
但如果您想要返回字节数组,您仍然可以使用 stream.ToArray()
像这样从字节数组构造流会产生什么样的开销?内存使用情况主要是我想知道的。
使用此方法创建的流无法进一步扩展。
A
Arsen Khachaturyan

您正在寻找 MemoryStream.Write method

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

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

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

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

这是最好的答案。它简明扼要,涵盖了所有实际应用。仅使用此处所示的基于字节数组的构造函数存在一个问题——生成的流不可重新调整大小。
还记得之后重置流:stream.Seek(0, SeekOrigin.Begin);
请注意,第一个选项 MemoryStream.Writenew MemoryStream(myByteArray) 消耗更多内存
为什么,确切地说,是@jitbit?自从我做任何 .NET 以来已经有很多年了,所以如果我要更新这个答案来评论性能,我需要更多信息。
默认情况下,在 MemoryStream 缓冲区中分配了额外的空间(就像列表一样)。这可以通过使用允许您设置容量的重载轻松处理,但只有在您不希望将任何数据写入流(或者如果您知道您可能需要多少额外字节时)才真正有用)。但我怀疑 jitbit 可能指的是当您使用 byte[] 构造函数时,不会复制数组 - MemoryStream 指的是参数中的数组。这可能是好的也可能是坏的,有点遗憾的是它没有在 MSDN 上记录:)
j
johnnyRose

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

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

V
Vadim Ovchinnikov

查看 MemoryStream 类。


R
Rod Talingting

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

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

为什么可能需要将位置设置为零,你知道吗?