高效串联
Efficient concatenation
我正在尝试通过 LPWAN 发送消息,我面临的问题之一是尽量缩短消息的长度。
例如:
我有两个整数 (0-100) 和两个布尔值,我必须将它们转换为十六进制以通过 LPWAN 发送。示例:
- 24
- 63
- 正确
- 错
当我将其连接为 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
<<操作实现上面的
我正在尝试通过 LPWAN 发送消息,我面临的问题之一是尽量缩短消息的长度。
例如:
我有两个整数 (0-100) 和两个布尔值,我必须将它们转换为十六进制以通过 LPWAN 发送。示例:
- 24
- 63
- 正确
- 错
当我将其连接为 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
<<操作实现上面的