高效串联

Efficient concatenation

我正在尝试通过 LPWAN 发送消息,我面临的问题之一是尽量缩短消息的长度。

例如:

我有两个整数 (0-100) 和两个布尔值,我必须将它们转换为十六进制以通过 LPWAN 发送。示例:

当我将其连接为 246310(十六进制:3C226)时,这将占用 3 个字节。但是,我知道我的第一个整数永远不会高于 50,也就是 6 位。我可以让十六进制消息比 3C226 更短吗?

是的,这应该是可能的。

您的字段的位数是:

  • integer0:整数 0..50,6 位。
  • integer1:整数 0..80,7 位。
  • flag0:布尔值,1 位。
  • flag1:布尔值,1 位。

总共是 6 + 7 + 1 + 1 = 15 位。

编码方式如下:

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |                 |                    |  |  |
|  |  integer0       |  integer1          |f0|f1|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

uint16_t encode(uint8_t integer0, uint8_t integer1, bool flag0, bool flag1)
{
  return ((uint16_t) integer0 << 9) | ((uint16_t) integer1 << 2) | ((uint16_t) flag0 << 1) | flag1;
}

使用 2 个字节,该值可以存储为:

   FirstNum         Second        1st bool     2nd bool
<------------> <------------> <------------> <------------>
     6bits          7bits          1bit          1bit

你还剩下1位。

使用left shift<<操作实现上面的