c# - 在 C# 中缓冲字节数据

标签 c# .net

我的应用程序从 TCP 套接字读取字节并需要缓冲它们,以便我以后可以从中提取消息。由于 TCP 的性质,我可能会在一次读取中获得部分或多条消息,因此每次读取后我想检查缓冲区并提取尽可能多的完整消息。

因此我想要一个允许我执行以下操作的类:

  • 向其附加任意字节[]数据
  • 在不使用内容的情况下检查内容,特别是检查内容的数量并搜索某个字节或多个字节是否存在
  • 提取并使用部分数据作为 byte[],同时将其余数据留在那里以供将来读取

我希望我想要的可以用 .NET 库中的 1 个或多个现有类来完成,但我不确定是哪些。 System.IO.MemoryStream 看起来接近我想要的,但是 (a) 不清楚它是否适合用作缓冲区(读取数据是否从容量中删除?)和(b) 读取和写入似乎发生在同一个地方 - “流的当前位置是下一个读取或写入操作可能发生的位置。” - 这不是我想要的想。我需要写到最后,从前面开始阅读。

最佳答案

我建议您在后台使用 MemoryStream,但将其封装在另一个类中,该类存储:

  • MemoryStream
  • 当前“已读”位置
  • 当前“消耗”的位置

然后它将暴露:

  • 写入:设置流的位置到末尾,写入数据,将流的位置设置回读取的位置
  • Read:读取数据,设置读取位置为流的位置
  • 消费:更新消费位置(详细信息基于您尝试消费的方式);如果消费位置高于某个阈值,则将现有缓冲数据复制到新的 MemoryStream 并更新所有变量。 (您可能不想在每个 消费请求时复制缓冲区。)

请注意,如果没有额外的同步,这些都不是线程安全的。

关于c# - 在 C# 中缓冲字节数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7122972/

相关文章:

c# - 日期格式化 WPF 数据网格

c# - 跟踪 Entity Framework 中与行为的多对多关系的变化

c# - 我的 .Net 应用程序可以引用两个不同版本的 .net 框架库吗?

c# - .NET 4.6 中的二进制序列化速度较慢(有时)

c# - HttpUtility.ParseQueryString 的可移植类库 (PCL) 版本

c# - 如何在 WP7 中处理 HttpWebRequest 的错误?

c# - 按下主页按钮或返回主菜单时取消协程

c# - C# 和 java 中的 volatile 有什么区别?

c# - 在 c# 项目中使用 XSD 构建任务

c# - directshow.net 网络摄像头覆盖透明面板