Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 为什么MQTT对剩余长度使用如此奇怪的编码方案?_Algorithm_Encoding_Mqtt - Fatal编程技术网

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

Algorithm 为什么MQTT对剩余长度使用如此奇怪的编码方案?,algorithm,encoding,mqtt,Algorithm,Encoding,Mqtt,我最近开始为微控制器编写MQTT库。我一直在跟踪。第2.2.3节解释了剩余长度字段(固定报头的一部分)如何编码数据包其余部分中要遵循的字节数 它使用了一种稍微奇怪的编码方案: Byte 0=a mod 128,a/=128,如果a>0,设置顶部位并添加字节1 字节1=a模128,a/=128,如果a>0,则设置顶部位。。。etc 在这个应用程序中,这种可变长度编码似乎很奇怪。您可以使用更少的字节轻松地传输相同的数字,尤其是使用此方案进入占用2-4字节的数字时。MQTT被设计为易于使用和实现。那么

我最近开始为微控制器编写MQTT库。我一直在跟踪。第2.2.3节解释了剩余长度字段(固定报头的一部分)如何编码数据包其余部分中要遵循的字节数

它使用了一种稍微奇怪的编码方案:
Byte 0=a mod 128,a/=128,如果a>0,设置顶部位并添加字节1
字节1=a模128,a/=128,如果a>0,则设置顶部位。。。etc

在这个应用程序中,这种可变长度编码似乎很奇怪。您可以使用更少的字节轻松地传输相同的数字,尤其是使用此方案进入占用2-4字节的数字时。MQTT被设计为易于使用和实现。那么他们为什么选择这个方案呢

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

这种编码方案有什么好处?为什么要用它?我能找到的唯一一篇提到任何动机的博客文章是:

剩余长度字段的编码需要一位额外的位和字节处理,但好处是大多数消息只需要一个字节,同时保留发送最大为268'435'455字节的较大消息的能力

但这对我来说没有意义。如果使用整个第一个字节来表示0-255,而不是0-127,则可能会有更多的消息仅为一个字节。如果你使用十六进制,你可以表示一个大到429467295的数字,而不仅仅是268435455


有人知道为什么会使用这个吗?

正如您引用的评论所解释的,假设“大多数消息只需要一个字节”,或者换句话说,假设大多数情况下,
a正如您引用的评论所解释的,假设“大多数消息只需要一个字节”,或者换句话说,假设大部分时间
a啊,当然,我忘了你必须知道长度是多少字节。啊,当然,我忘了你必须知道长度是多少字节。