1 from struct
import Struct
, calcsize
, unpack
11 acc_header
= BinaryData
._header
_lst
(lst
, acc_header
)
12 lst
= [acc_header
] + lst
13 acc_fmt
, acc_elems
= BinaryData
._pack
_lst
(lst
, acc_fmt
, acc_elems
)
14 msg_struct
= Struct(acc_fmt
)
15 msg_data
= msg_struct
.pack(*acc_elems
)
16 return msg_struct
.size
, msg_data
19 def _header_elm(elm
, acc_header
):
20 if elm
is None: add
= 'n'
21 elif isinstance(elm
, bool): add
= 'b'
22 elif isinstance(elm
, int): add
= 'i'
23 elif isinstance(elm
, float): add
= 'f'
24 elif isinstance(elm
, str): add
= 's'
25 elif isinstance(elm
, dict): add
= '{}'
26 elif isinstance(elm
, tuple) or isinstance(elm
, list):
27 add
= BinaryData
._header
_lst
(elm
, acc_header
)
28 return acc_header
+ add
31 def _header_lst(elm
, acc_header
):
34 add
+= BinaryData
._header
_elm
(sub_elm
, acc_header
)
36 return acc_header
+ add
39 def _pack_lst(lst
, acc_fmt
, acc_elems
):
40 add_fmt
, add_elems
= '', []
42 elm_fmt
, elm_elems
= BinaryData
._pack
_elm
(sub_elm
, '', [])
44 add_elems
+= elm_elems
45 return acc_fmt
+ add_fmt
, acc_elems
+ add_elems
48 def _pack_elm(elm
, acc_fmt
, acc_elems
):
52 elif isinstance(elm
, bool):
55 elif isinstance(elm
, int):
58 elif isinstance(elm
, float):
61 elif isinstance(elm
, str):
62 b_str
= bytes(elm
, 'utf-8')
63 add_fmt
= 'i%ds' % len(b_str
)
64 add_elems
= [len(b_str
), b_str
]
65 elif isinstance(elm
, tuple) or isinstance(elm
, list):
66 add_fmt
, add_elems
= BinaryData
._pack
_lst
(elm
, '', [])
67 elif isinstance(elm
, dict): add_fmt
, add_elems
= '', []
68 return acc_fmt
+ add_fmt
, acc_elems
+ add_elems
72 header_length
, data
= BinaryData
.unpack_helper('!i', data
)
73 header_length
= header_length
[0]
74 header
, data
= BinaryData
.unpack_helper('!%ds' % header_length
, data
)
75 header
= header
[0].decode('utf-8')
79 def parent(sublist
, lst
):
80 if sublist
in lst
: return lst
81 for _subl
in [elm
for elm
in lst
if isinstance(elm
, list)]:
82 if parent(sublist
, _subl
): return parent(sublist
, _subl
)
86 curr_lst
= curr_lst
[-1]
88 curr_lst
= parent(curr_lst
, vals
)
90 elif elm
== '}': curr_lst
+= [{}]
92 val
, data
= BinaryData
._unpack
_elm
(elm
, data
)
97 def _unpack_elm(elm
, data
):
99 val
, data
= [None], data
102 val
, data
= BinaryData
.unpack_helper('!?', data
)
105 val
, data
= BinaryData
.unpack_helper('!i', data
)
108 val
, data
= BinaryData
.unpack_helper('!f', data
)
111 s_len
, data
= BinaryData
.unpack_helper('!i', data
)
112 val
, data
= BinaryData
.unpack_helper('!%ds' % s_len
, data
)
113 val
= val
[0].decode('utf-8')
117 def unpack_helper(fmt
, data
):
119 return unpack(fmt
, data
[:size
]), data
[size
:]