目前我正在尝试通过LPWAN发送消息,我面临的一个问题是尽量让我的消息尽可能短。
例如:
我有两个整数(0-100)和两个布尔值我必须转换为十六进制才能通过LPWAN发送。例如:
当我将其连接为246310(十六进制:3C226)时,这将占用3个字节。但是,我知道我的第一个整数永远不会高于50,只有6位。我是否可以使十六进制消息比3C226短?
答案 0 :(得分:3)
是的,这应该是可能的。
您的字段的位数为:
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;
}
答案 1 :(得分:2)
使用2个字节,该值可以存储为:
FirstNum Second 1st bool 2nd bool
<------------> <------------> <------------> <------------>
6bits 7bits 1bit 1bit
你仍然留下1位。
使用left shift
&lt;&lt;操作实现上述目的。