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

使用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,可以手动实现读取逻辑。

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

示例代码:

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 是最简单可靠的方案。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1441639.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 18:17:19
下一篇 2025年12月17日 18:17:33

相关推荐

发表回复

登录后才能评论
关注微信