首页 > C# > 从输入流创建字节数组的首选方法是什么?

从输入流创建字节数组的首选方法是什么?

上一篇 下一篇

从输入流创建字节数组的首选方法是什么?

这是我目前使用 .NET 3.5 的解决方案。

Stream s;
byte[] b;

using (BinaryReader br = new BinaryReader(s))
{
    b = br.ReadBytes((int)s.Length);
}

读取和写入流块仍然是一个更好的主意吗?

分割线

网友回答:

虽然 Jon 的回答是正确的,但他正在重写 中已经存在的代码。因此,对于.Net 4,请使用Sandip的解决方案,但对于以前版本的.Net,请使用Jon的答案。Sandip 的代码可以通过使用“using”来改进,因为在许多情况下,例外是很有可能的,并且会留下未处理的内容。CopyToCopyToMemoryStream

public static byte[] ReadFully(Stream input)
{
    using (MemoryStream ms = new MemoryStream())
    {
        input.CopyTo(ms);
        return ms.ToArray();
    }
}

分割线

网友回答:

这真的取决于你是否可以信任.对于许多流,您只是不知道会有多少数据。在这种情况下 – 在.NET 4之前 – 我会使用这样的代码:s.Length

public static byte[] ReadFully(Stream input)
{
    byte[] buffer = new byte[16*1024];
    using (MemoryStream ms = new MemoryStream())
    {
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            ms.Write(buffer, 0, read);
        }
        return ms.ToArray();
    }
}

对于 .NET 4 及更高版本,我会使用 ,它基本上等同于我的代码中的循环 – 创建 、 调用然后返回 。工作完成。Stream.CopyToMemoryStreamstream.CopyTo(ms)ms.ToArray()

我也许应该解释一下为什么我的回答比其他答案长。 不保证它会读取它要求的所有内容。例如,如果您正在从网络流中读取,它可能会读取一个数据包的价值,然后返回,即使很快就会有更多的数据。 将继续运行,直到流结束或您指定的大小,但您仍然必须知道开始的大小。Stream.ReadBinaryReader.Read

上述方法将继续读取(并复制到 中),直到数据耗尽。然后,它要求 返回数组中数据的副本。如果您知道要开始的大小 – 或者认为您知道大小,但不确定 – 您可以构建为该大小开始。同样,您可以在末尾进行检查,如果流的长度与缓冲区(由 返回)的大小相同,那么您可以只返回缓冲区。所以上面的代码没有完全优化,但至少是正确的。它不承担关闭流的任何责任 – 调用方应该这样做。MemoryStreamMemoryStreamMemoryStreamMemoryStream.GetBuffer

有关详细信息(以及替代实现),请参阅本文。

分割线

网友回答:

只是想指出,如果你有一个内存流,你已经有。memorystream.ToArray()

此外,如果您正在处理未知或不同子类型的流,并且您可以收到一个 ,您可以针对这些情况中继所述方法,并且仍然对其他情况使用可接受的答案,如下所示:MemoryStream

public static byte[] StreamToByteArray(Stream stream)
{
    if (stream is MemoryStream)
    {
        return ((MemoryStream)stream).ToArray();                
    }
    else
    {
        // Jon Skeet's accepted answer 
        return ReadFully(stream);
    }
}

模板简介:该模板名称为【从输入流创建字节数组的首选方法是什么?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 493次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-21
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信素材 企业网站 微信公众平台 单页式简历模板 微信图片 自适应 微信模板 html5 微信文章 响应式
您可能会喜欢的其他模板