-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbjevko.py
More file actions
42 lines (40 loc) · 1.28 KB
/
bjevko.py
File metadata and controls
42 lines (40 loc) · 1.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
def deser(bs):
length = len(bs)
affixes = []
i = 0
depth = 0
while (i < length):
b = bs[i]
i += 5
if (i > length): raise f"unexpected end while reading length: expected at least {i - length} more bytes"
data_len = int.from_bytes(bs[i - 4:i - 1], 'little', signed = False)
data = (bs, i, data_len)
i += data_len
if (i > length): raise f"unexpected end while reading a slice: expected at least {i - length} more bytes"
affixes.append((b, data))
depth += int.from_bytes([b], 'little', signed = True)
if (depth == -1): break
if (i < length): raise f"expected end: unexpected {length - i} bytes left"
if (depth > 0): raise f"unexpected end: expected {depth} closers"
return affixes
def seria(affixes):
ret = bytearray()
for (b, data) in affixes:
(bs, i, len) = data
ret.append(b)
ret.extend(len.to_bytes(4, 'little'))
ret.extend(bs[i:i + len])
return bytes(ret)
def to_tree(nedges, state = None):
if (state == None): state = {'i':0}
parent = [[], bytes()]
while (state['i'] < len(nedges)):
(b, data1) = nedges[state['i']]
data = data1[0][data1[1]:data1[1]+data1[2]]
state['i'] += 1
if (b == 1):
parent[0].append((data, to_tree(nedges, state)))
else:
parent[1] = data
break
return tuple(parent)