encode Vs struct
-
I'm trying to get my head around the difference between
>>> struct.pack('4s', 'ping') b'ping'
and
>>> 'ping'.encode() b'ping'
is it just an a case of doing the same thing 2 different ways or is there some subtle difference I'm missing? I'm trying to figure out if there is a way to reduce the payload size of an epoch (10digits) sent over rawlora as per https://forum.pycom.io/topic/5555/lopy4-to-lopy4-over-lora-raw-pack-string/5.
-
@kjm That's a good way doing it. As a matter of preference & PEP8 coding style I would write it as:
import struct slot = 15 rtu = 14 slotrtu = (slot & 0x0f) | (rtu << 4) packet = struct.pack('B', slotrtu)
Using binary operators instead of arithmetic ones results in the same value but expresses more clearly the intention. And using
slot & 0x0f
is more a 'belt and straps' attitude.
The only important change is using B instead of b, indicating that the number is unsigned, which however mostly matters on unpack.
-
@robert-hh So if I want to pack two 0-15 range variables into a byte, is there a better way than
import struct slot=15; rtu=14 slotrtu=slot+rtu*16 packet=struct.pack('b', slotrtu) print(packet)
to do it?
-
@kjm I epoch is a number < 2^32, you can pack that as binary value using struct.pack("L", epoch). That will result in a 4 bytes object of 4 bytes length.
Larger numbers may have to be split.