【问题标题】:Finding framed data in a byte-array在字节数组中查找帧数据
【发布时间】:2011-06-03 17:04:42
【问题描述】:

我有一个字节数组,其中包含从 WebSocket 客户端接收到的数据。我拥有的数据可以是 1 次接收,也可以是缓冲数据 + 最后一次接收。这取决于天气或是否有任何数据缓冲。

现在,当接收到数据时,确实应该发生 3 种可能的事情,它们如下(注意,这是在我将接收到的数据与缓冲区连接之后):

  1. 已收到部分消息: 客户端开始发送消息,但只有部分消息(开头)已进入低谷。我收到的数据需要缓冲,直到收到其余数据。
  2. 已收到完整的消息:客户端已发送完整的消息。应随消息触发一个事件。
  3. 收到关闭信号:客户端已发送关闭信号的请求。

现在,没有充分的理由说明为什么不应该同时发生其中的几个(例如,收到 1 条半消息,或者收到 1 条消息并收到关闭信号)。 websocket 中的消息以字节 0x00 和 0xFF 为框架,换句话说,传入的消息看起来像这样:0x00,...binary UTF8 data,0xFF,0x00,...binary UTF8 data,0xFF,结束信号看起来像这样:0xFF,0x00。现在,我需要一种有效的方式来获取传入的数据流并将其拆分为消息或结束信号。我以前从未使用过这样的框架数据,所以我不确定如何有效地做到这一点。我想要的或多或少是一个函数,它将二进制数据作为一个数组接收,并返回消息(作为没有帧的二进制数据)或关闭标志,以及一个带有要缓冲数据的字节数组。重要的是它速度很快并且不会消耗太多不必要的内存。或者如果你有一些链接可以帮助我解决这个问题,我会很高兴地接受它们。

【问题讨论】:

    标签: c# binary performance websocket


    【解决方案1】:

    您的关闭信号只是一条空消息,并非真正的特殊情况。

    因此,您所拥有的是在线段和解释消息之间的不匹配。

    看起来并不难,你必须从字节流中提取 0x00 到 0xFF 之间的序列。您将需要一个大于最大消息的缓冲区,您必须扫描所有传入的字节并提取完整的消息并将剩余的“向下”移动到缓冲区。

    您还需要:

    • 验证您的 UTF8 数据不能包含 0x00 或 0xFF,我不确定这是真的
    • 处理 0xFF 后跟 0x00 以外的其他内容的情况

    【讨论】:

    • 关闭信号不是空消息,因为字节顺序颠倒了,结果如下:..data, 0xFF, 0xFF, 0x00。此外,数据不应包含 0x00 和 0xFF。但是,我需要知道如何做的是你在这里写的:“你将不得不扫描所有传入的字节并提取完整的消息并将剩余的'向下'移动到缓冲区”。我不知道如何在代码中以一种好的方式做到这一点。我为此写的原型我使用Linq的Skip(1).TakeUntill(b => b == 0xFF)来获取消息,但是使用可枚举来获取低谷,并且效率不高,还是我错了?
    • @Alxandr:效率如何?只有你能说出来,因为只有两个衡量标准很重要:“足够好”和“不够好”。测量一下看看。
    • 目前看来已经够用了,但我得压力测试一下看看。
    猜你喜欢
    • 2016-02-17
    • 1970-01-01
    • 2011-12-20
    • 2016-04-27
    • 2019-11-17
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多