From 3012060e0d2b5a98805a7c5bb6ef3c60d31f2c4e Mon Sep 17 00:00:00 2001 From: David Kerkeslager Date: Sat, 24 Sep 2016 16:59:10 -0400 Subject: [PATCH] Serialization for unsigned integers --- serial/binary.py | 19 +++++++++++++++++++ serial/test_binary.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/serial/binary.py b/serial/binary.py index e8c9093..f6bcff7 100644 --- a/serial/binary.py +++ b/serial/binary.py @@ -1,9 +1,15 @@ import collections +import functools import io +import struct TAG_NULL = 0x00 TAG_TRUE = 0x01 TAG_FALSE = 0x02 +TAG_UINT8 = 0x03 +TAG_UINT16 = 0x04 +TAG_UINT32 = 0x05 +TAG_UINT64 = 0x06 TaggedObject = collections.namedtuple( 'TaggedObject', @@ -22,10 +28,23 @@ def _make_tag_only_serializer(tag, expected_value): return serializer +def _make_struct_serializer(fmt): + fmt = '!B' + fmt + packer = functools.partial(struct.pack, fmt) + + def serializer(to): + return packer(to.tag, to.instance) + + return serializer + _TAGS_TO_SERIALIZERS = { TAG_NULL: _make_tag_only_serializer(TAG_NULL, None), TAG_TRUE: _make_tag_only_serializer(TAG_TRUE, True), TAG_FALSE: _make_tag_only_serializer(TAG_FALSE, False), + TAG_UINT8: _make_struct_serializer('B'), + TAG_UINT16: _make_struct_serializer('H'), + TAG_UINT32: _make_struct_serializer('I'), + TAG_UINT64: _make_struct_serializer('Q'), } def serialize(to): diff --git a/serial/test_binary.py b/serial/test_binary.py index b9acaa5..2223ef8 100644 --- a/serial/test_binary.py +++ b/serial/test_binary.py @@ -26,6 +26,37 @@ class SerializeTests(unittest.TestCase): b'\x02', ) + def test_serializes_unsigned_integer_types(self): + self.assertEqual( + binary.serialize(binary.TaggedObject( + tag = binary.TAG_UINT8, + instance = 7, + )), + b'\x03\x07', + ) + self.assertEqual( + binary.serialize(binary.TaggedObject( + tag = binary.TAG_UINT16, + instance = 7, + )), + b'\x04\x00\x07', + ) + self.assertEqual( + binary.serialize(binary.TaggedObject( + tag = binary.TAG_UINT32, + instance = 7, + )), + b'\x05\x00\x00\x00\x07', + ) + self.assertEqual( + binary.serialize(binary.TaggedObject( + tag = binary.TAG_UINT64, + instance = 7, + )), + b'\x06\x00\x00\x00\x00\x00\x00\x00\x07', + ) + + class DeserializeTests(unittest.TestCase): def test_deserializes_tag_only_types(self): self.assertEqual( -- 2.20.1