X-Git-Url: https://code.kerkeslager.com/?p=sandbox;a=blobdiff_plain;f=serial%2Fbinary.py;h=c4693dbf494d4ae1a1d3109e6a519aa64993b707;hp=f6bcff7da4ee200cc72aee7dee2ef48a806d4c2d;hb=52098cc5feb485d38a03619bead2ebe79d8d804d;hpb=3012060e0d2b5a98805a7c5bb6ef3c60d31f2c4e diff --git a/serial/binary.py b/serial/binary.py index f6bcff7..c4693db 100644 --- a/serial/binary.py +++ b/serial/binary.py @@ -56,10 +56,26 @@ def _make_tag_only_parser(tag, value): return parser +def _make_struct_deserializer(tag, fmt): + fmt = '!' + fmt + size = struct.calcsize(fmt) + unpacker = functools.partial(struct.unpack, fmt) + + def parser(b): + b = b.read(size) + assert len(b) == size + return TaggedObject(tag = tag, instance = unpacker(b)[0]) + + return parser + _TAGS_TO_PARSERS = { TAG_NULL: _make_tag_only_parser(TAG_NULL, None), TAG_TRUE: _make_tag_only_parser(TAG_TRUE, True), TAG_FALSE: _make_tag_only_parser(TAG_FALSE, False), + TAG_UINT8: _make_struct_deserializer(TAG_UINT8, 'B'), + TAG_UINT16: _make_struct_deserializer(TAG_UINT16, 'H'), + TAG_UINT32: _make_struct_deserializer(TAG_UINT32, 'I'), + TAG_UINT64: _make_struct_deserializer(TAG_UINT64, 'Q'), } def deserialize(b):