python3 decode mqtt remaining length swapped
Ercsion opened this issue · comments
Ercsion commented
Bug or feature
python3 decode mqtt remaining length swapped
What is wrong / not implemented
when mqtt length > 127, for example 428 which 0x1AC in hex, MQTT header.length bytes is [AC 03]
length decode to [16 03] as:
0xAC & 0x7F = 0x2C
0xAC bit 7 is setted then :
(0x2C<<7) | (0x03 & 0x7F) = 0x1603
0x03 bit 7 is not setted then return 0x1603
How should it be
0xAC & 0x7F = 0x2C
0xAC bit 7 is setted then :
(0x2C) | ((0x03 & 0x7F)<<7) = 0x1AC
0x03 bit 7 is not setted then return 0x1AC
Correct behaviour is documented in (URL)
pass
Environment
* GitHub commit:
- Prog language: Python3.10
- OS/hardware:Window10
Fixed/implemented in
- Pyhon implementation
- Java implementation
- Java tools
- C implementation/Unix
- C implementation/Embedded
- Lua implementation
- CodeSys implementation
Patch
def unpack_remaining_length(pkt):
remaining_length = 0
-- eaten = 0;
++ eaten = 0
while True:
b = pkt[0]
eaten += 1
pkt = pkt[1:]
-- remaining_length = remaining_length << 7
-- remaining_length = remaining_length | (b & 0x7F)
++ remaining_length += (b & 0x7F) << (7 * (eaten - 1))
if (b & 0x80) == 0:
break
return remaining_length, pkt, eaten