0

0

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

幻夢星雲

幻夢星雲

发布时间:2025-11-14 09:57:06

|

706人浏览过

|

来源于php中文网

原创

使用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;

byte[] ConvertToByteArray(MemoryStream stream) { return stream.ToArray(); }

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

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

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

示例代码:

using System.IO;

byte[] ReadStreamToByteArray(Stream stream) { using (var memoryStream = new MemoryStream()) { stream.CopyTo(memoryStream); return memoryStream.ToArray(); } }

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

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

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

STORYD
STORYD

帮你写出让领导满意的精美文稿

下载

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

示例代码:

byte[] ReadStreamManually(Stream stream)
{
    long originalPosition = 0;
    if (stream.CanSeek)
    {
        originalPosition = stream.Position;
        stream.Position = 0;
    }
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;

async Task ReadStreamToByteArrayAsync(Stream stream) { using (var memoryStream = new MemoryStream()) { await stream.CopyToAsync(memoryStream); return memoryStream.ToArray(); } }

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

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

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

471

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

471

2023.08.10

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

4

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

7

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

42

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

4

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.7万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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