45人参与 • 2025-07-31 • Asp.net
memorystream
中的 getbuffer()
和 toarray()
是两个用于获取流数据的方法,但它们的核心区别在于 数据范围、内存占用和安全性。
特性 | getbuffer() | toarray() |
---|---|---|
返回内容 | 返回 底层缓冲区的完整数组 (包含未使用的空间)。 | 返回 仅包含有效数据的数组 (排除未使用的空间)。 |
内存占用 | 可能包含大量未使用的空字节(0 填充), 占用更多内存。 | 仅包含实际写入的数据, 内存更高效。 |
性能 | 速度快(直接返回引用,无需复制)。 | 速度较慢(需复制数据到新数组)。 |
安全性 | 可能暴露未初始化的字节(0 填充), 可能导致数据污染或解析错误。 | 仅返回有效数据, 避免未初始化字节的干扰。 |
public class program { public static void main(string[] args) { using (memorystream ms = new memorystream()) { byte[] data = encoding.utf8.getbytes("test"); ms.write(data, 0, data.length); byte[] buffer = ms.getbuffer(); // 返回长度为 256 的数组(默认初始容量为 256) console.writeline(buffer.length); // 输出:256 console.writeline(ms.length); // 输出:4(实际数据长度) console.writeline(bitconverter.tostring(buffer)); // 输出:74-65-73-74-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 } } }
0
填充字节(如示例中的 256 - 4 = 252
个 0
)。buffer
,可能导致数据解析错误(例如,将 0
误认为有效数据)。public class program { public static void main(string[] args) { using (memorystream ms = new memorystream()) { byte[] data = encoding.utf8.getbytes("test"); ms.write(data, 0, data.length); byte[] bytes = ms.toarray(); // 返回长度为 4 的数组 console.writeline(bytes.length); // 输出:4 console.writeline(ms.length); // 输出:4(实际数据长度) console.writeline(bitconverter.tostring(bytes));//输出:74-65-73-74 } } }
length
指定的范围),无多余 0
填充。场景 | 推荐方法 | 原因 |
---|---|---|
需要高效访问底层缓冲区(如直接操作内存) | getbuffer() | 避免复制开销,但需确保仅使用有效数据范围。 |
需要精确数据(如网络传输、文件保存) | toarray() | 确保数据不含未使用的 0,避免解析错误(如 excel 文件损坏问题)。 |
流的容量远大于实际数据 | toarray() | 避免浪费内存(如示例中 256 字节 vs 4 字节)。 |
需要避免未初始化字节的干扰 | toarray() | 仅返回有效数据,安全性更高。 |
getbuffer()
的限制:
memorystream
是通过 memorystream(byte[] buffer, bool writable)
构造函数创建,并且 publiclyvisible
参数未设置为 true
,则调用 getbuffer()
会抛出 unauthorizedaccessexception
。toarray()
或确保构造时允许公开访问缓冲区。capacity
vs length
:
capacity
是底层缓冲区的总大小(如默认 256
)。length
是实际写入数据的大小(如 4
)。getbuffer()
返回的数组长度等于 capacity
,而 toarray()
返回的数组长度等于 length
。getbuffer()
直接操作内存,但需严格控制访问范围(如 length
内)。toarray()
,避免未初始化字节的干扰。toarray()
,除非明确需要直接操作底层缓冲区且能确保安全。toarray()
更可靠(如解决 excel 文件损坏问题)。trygetbuffer()
替代 getbuffer()
,避免异常风险。trygetbuffer()
方法,可安全检查是否允许获取缓冲区:using (memorystream ms = new memorystream()) { if (ms.trygetbuffer(out var buffer)) { // 安全获取缓冲区 byte[] data = new byte[ms.length]; array.copy(buffer.array, buffer.offset, data, 0, (int)ms.length); } else { // 使用 toarray() byte[] data = ms.toarray(); } }
到此这篇关于c# memorystream 中 toarray 和 getbuffer 的区别的文章就介绍到这了,更多相关c# toarray getbuffer内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论