C# 怎么将 Stream 转换为 byte 数组_C# Stream 转 byte 数组方法详解

幻夢星雲
发布: 2025-11-14 09:57:06
原创
676人浏览过
使用MemoryStream的ToArray或CopyTo是转换Stream到byte数组的常用方法,适用于多数场景;对于非MemoryStream可采用循环读取或异步CopyToAsync,兼顾兼容性与性能。

c# 怎么将 stream 转换为 byte 数组_c# stream 转 byte 数组方法详解

在 C# 中,将 Stream 转换为 byte 数组 是常见的操作,尤其是在处理文件、网络数据或图像时。下面介绍几种常用且高效的方法。

使用 MemoryStream 的 ToArray 方法

如果原始 Stream 是 MemoryStream,可以直接调用 ToArray() 方法获取 byte 数组。

注意:此方法会复制整个缓冲区,包括未使用的部分,因此可能包含多余字节

示例代码:

using System.IO;
<p>byte[] ConvertToByteArray(MemoryStream stream)
{
return stream.ToArray();
}
登录后复制

通用方法:通过 Read 全部读取

对于任意类型的 Stream(如 FileStream、NetworkStream 等),推荐使用循环读取的方式,确保所有数据都被加载到 byte 数组中。

关键点是使用一个缓冲区不断读取,直到流结束。

示例代码:

using System.IO;
<p>byte[] ReadStreamToByteArray(Stream stream)
{
using (var memoryStream = new MemoryStream())
{
stream.CopyTo(memoryStream);
return memoryStream.ToArray();
}
}
登录后复制

这种方法利用了 CopyTo 方法,简洁高效,适用于大多数场景。

手动读取避免 CopyTo(适用于 .NET Framework 旧版本)

如果环境不支持 CopyTo,可以手动实现读取逻辑。

阿里云-虚拟数字人
阿里云-虚拟数字人

阿里云-虚拟数字人是什么? ...

阿里云-虚拟数字人 2
查看详情 阿里云-虚拟数字人

定义固定大小的缓冲区,逐段读入,最后合并成完整数组。

示例代码:

byte[] ReadStreamManually(Stream stream)
{
    long originalPosition = 0;
    if (stream.CanSeek)
    {
        originalPosition = stream.Position;
        stream.Position = 0;
    }
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">try
{
    byte[] buffer = new byte[4096];
    int totalBytesRead = 0;
    int bytesRead;
    while ((bytesRead = stream.Read(buffer, totalBytesRead, buffer.Length - totalBytesRead)) > 0)
    {
        totalBytesRead += bytesRead;

        if (totalBytesRead == buffer.Length)
        {
            int nextByte = stream.ReadByte();
            if (nextByte != -1)
            {
                byte[] newBuffer = new byte[buffer.Length * 2];
                Buffer.BlockCopy(buffer, 0, newBuffer, 0, buffer.Length);
                newBuffer[totalBytesRead] = (byte)nextByte;
                buffer = newBuffer;
                totalBytesRead++;
            }
        }
    }

    byte[] result = new byte[totalBytesRead];
    Buffer.BlockCopy(buffer, 0, result, 0, totalBytesRead);
    return result;
}
finally
{
    if (stream.CanSeek)
    {
        stream.Position = originalPosition;
    }
}
登录后复制

}

这段代码考虑了流的位置恢复和动态扩容,适合对兼容性和控制要求较高的场景。

异步方式转换 Stream 到 byte 数组

在异步编程中,可使用 CopyToAsync 避免阻塞主线程。

示例代码:

using System.Threading.Tasks;
<p>async Task<byte[]> ReadStreamToByteArrayAsync(Stream stream)
{
using (var memoryStream = new MemoryStream())
{
await stream.CopyToAsync(memoryStream);
return memoryStream.ToArray();
}
}
登录后复制

适用于 Web API、服务端处理大文件上传等需要高并发的场景。

基本上就这些。选择哪种方法取决于你的具体需求:是否已知是 MemoryStream、是否需要异步、是否兼容老版本框架。合理使用 MemoryStreamCopyTo 是最简单可靠的方案。

以上就是C# 怎么将 Stream 转换为 byte 数组_C# Stream 转 byte 数组方法详解的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号