【问题标题】:Efficient C# byte queue for parsing stream of bytes for binary message packets用于解析二进制消息包的字节流的高效 C# 字节队列
【发布时间】:2011-03-17 14:15:14
【问题描述】:

我正在尝试替换我通常实现为循环缓冲区的内容+。队列的功能是缓冲传入的字节(例如,来自串行端口或其他数据流),而解析器检查队列中的字节并检测和提取消息包。

标准:

  • 可以增长(即不是固定大小)
  • = 一次可以入队 1 个字节

  • = 一次可以出列 1 个字节

  • 高效

我很想使用

System.Collections.Generic.Queue<byte>

...但我不确定这是否是最有效的类型。有什么建议吗?

有没有更聪明的方法来做我想做的事情? (例如,有趣的建议here

感谢您的建议和意见。

前奏。

【问题讨论】:

    标签: c# data-structures queue buffer


    【解决方案1】:

    嗯,Queue&lt;byte&gt; 在内存方面会很有效。它基本上是幕后的byte[]。但是,如果您想一次将整个块出队或入队,使用起来可能会有些尴尬。每个操作都应该为单个字节摊销 O(1),导致 O(n) 将大小为 n 的块入队或出队......但比例因子将高于(例如)缓冲区块副本。

    【讨论】:

      【解决方案2】:

      Queue&lt;byte&gt;byte[] 支持,但如果使用Array.Copy 复制到/从底层缓冲区而不是循环通过入队/出队方法,您会看到更好的性能。所以就个人而言,如果Queue&lt;byte&gt; 不能为您提供所需的性能,那么您可以实现自己的队列类,该类提供 QueueMultiple 和 DequeueMultiple 方法。

      【讨论】:

        【解决方案3】:

        根据接收字节的方式以及解析器如何检查它们,您可能会考虑使用Queue&lt;byte[]&gt;

        【讨论】:

          【解决方案4】:

          我知道我没有帮助,但你可以自己写一篇。
          理论部分:
          队列应该在byte[] 和 2 个索引中,1 个用于头部,1 个用于尾部

          0 n |------------------------------------------------- ---| | | 头尾

          每次您需要添加k 字节时,您将尾部k 单位向左移动并将新空间中创建的数据放在那里。

          0 n |-------------------新数据-------------| | | | 头 新 尾巴 旧 尾巴

          每次您需要弹出k 字节时,您将头部向左移动k 个单位并从丢失的空间中获取数据。

          0 n |-------新数据-------------------------------------| | | | 新头头尾

          万一头部和尾部碰撞,你需要将容器的大小加倍,并将每一半复制到新的容器中。

          记住:如果你添加1234然后弹出2个字母你会得到34

          (我不知道是否应该将此帖子标记为社区维基)

          【讨论】:

          • 通常人们不会将他们的答案标记为社区 wiki。如果问题是社区 wiki,那么答案也将是社区 wiki。
          【解决方案5】:

          这是我不久前写的一个缓冲区的an efficient implementation

          • Resizeable:允许对数据进行排队,不抛出缓冲区溢出异常;
          • 高效:使用单个缓冲区和 Buffer.Copy 操作将数据入队/出队

          【讨论】:

          • 嗨@Kel,我将如何返回从您的实现中出列的实际字节并将它们存储在数组中以转换为char数组?谢谢。
          猜你喜欢
          • 1970-01-01
          • 2011-06-12
          • 2014-01-19
          • 1970-01-01
          • 2012-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-10
          相关资源
          最近更新 更多