使用MemoryStream的ToArray或CopyTo是转换Stream到byte数组的常用方法,适用于多数场景;对于非MemoryStream可采用循环读取或异步CopyToAsync,兼顾兼容性与性能。

在 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、是否需要异步、是否兼容老版本框架。合理使用 MemoryStream 和 CopyTo 是最简单可靠的方案。
以上就是C# 怎么将 Stream 转换为 byte 数组_C# Stream 转 byte 数组方法详解的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1441639.html
微信扫一扫
支付宝扫一扫