在字节数组中查找成帧数据

本文关键字:数据 查找 字节 字节数 数组 | 更新日期: 2023-09-27 17:58:13

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

现在,接收

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

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

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

在字节数组中查找成帧数据

您的关闭信号只是一个空消息,而不是真正的特例。

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

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

您还需要:

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