gpt4 book ai didi

algorithm - 为什么 MQTT 对剩余长度使用如此奇怪的编码方案?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:50:57 26 4
gpt4 key购买 nike

我最近开始为微 Controller 编写 MQTT 库。我一直在关注the specification document . 2.2.3 节解释了剩余长度字段(固定 header 的一部分)如何对数据包其余部分中要遵循的字节数进行编码。

它使用了一个稍微奇怪的编码方案:
字节 0 = a mod 128, a/= 128, 如果 a > 0, 设置最高位并添加字节 1
字节 1 = a mod 128,a/= 128,如果 a > 0,设置最高位...等等

这种可变长度编码在这个应用程序中看起来很奇怪。您可以使用更少的字节轻松地传输相同的数字,尤其是当您使用此方案处理需要 2-4 个字节的数字时。 MQTT 旨在易于使用和实现。那么他们为什么选择这个方案呢?

例如,十进制 15026222 将被编码为 0xae 0x90 0x95 0x7,但在十六进制中它是 0xE5482E -- 3 个字节而不是四个。计算编码方案并在另一端解码的开销似乎与 MQTT 应该在 8 位微 Controller 上实现快速且简单的想法相矛盾。

这种编码方案有什么好处?为什么使用它?我能找到的唯一一篇甚至提到任何动机的博文是 this one ,它说:

The encoding of the remaining length field requires a bit of additional bit and byte handling, but the benefit is that only a single byte is needed for most messages while preserving the capability to send larger message up to 268’435’455 bytes.

但这对我来说没有意义。如果您使用整个第一个字节来表示 0-255 而不是 0-127,您甚至可以让 更多 消息只是一个字节。如果您使用纯十六进制,则可以表示一个大到 4 294 967 295 的数字,而不仅仅是 268 435 455。

有人知道为什么要使用它吗?

最佳答案

正如您引用的评论所解释的那样,假设“大多数消息只需要一个字节”,或者换句话说,假设大多数情况下 a <= 127只需要一个字节来表示该值。

备选方案是:

  1. 使用一个值来明确指示 a 需要多少字节(或位) .这将需要至少 2 位来支持最多“4 字节”大小的 a对于所有消息。

  2. a 指定一个固定大小,可能是 4 个字节,用于所有消息。如果许多(读作:大多数)消息不使用此大小并且不能支持更大的值(如果这成为要求),则这是次等的。

关于algorithm - 为什么 MQTT 对剩余长度使用如此奇怪的编码方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51905426/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com