Skip to content

Commit c280f83

Browse files
author
Aabbdev
committed
Big refactoring & Fixed bug
1 parent d10603d commit c280f83

5 files changed

Lines changed: 251 additions & 252 deletions

File tree

python/Deserializer.py

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import sys, ctypes
2+
class Deserializer:
3+
def __init__(self, buffer):
4+
self.frombuffer(buffer)
5+
def __VerifyEntrySize(self, size):
6+
assert(type(size) == int)
7+
return len(self.buffer) < (self.position + size)
8+
def decode_8(self):
9+
if self.__VerifyEntrySize(1):
10+
return None
11+
value = self.buffer[self.position]
12+
self.position += 1
13+
return value
14+
def decode_16(self):
15+
if self.__VerifyEntrySize(2):
16+
return None
17+
value = None
18+
if sys.byteorder == "big":
19+
value = self.buffer[self.position]
20+
value |= self.buffer[self.position + 1] << 8
21+
else:
22+
value = self.buffer[self.position + 1]
23+
value |= self.buffer[self.position] << 8
24+
self.position += 2
25+
return value
26+
def decode_32(self):
27+
if self.__VerifyEntrySize(4):
28+
return None
29+
value = None
30+
if sys.byteorder == "big":
31+
value = self.buffer[self.position]
32+
value |= (self.buffer[self.position + 1] << 8)
33+
value |= (self.buffer[self.position + 2] << 16)
34+
value |= (self.buffer[self.position + 3] << 24)
35+
else:
36+
value = self.buffer[self.position + 3]
37+
value |= (self.buffer[self.position + 2] << 8)
38+
value |= (self.buffer[self.position + 1] << 16)
39+
value |= (self.buffer[self.position] << 24)
40+
self.position += 4
41+
return value
42+
def decode_64(self):
43+
if self.__VerifyEntrySize(8):
44+
return None
45+
value = None
46+
if sys.byteorder == "big":
47+
value = self.buffer[self.position]
48+
value |= (self.buffer[self.position + 1] << 8)
49+
value |= (self.buffer[self.position + 2] << 16)
50+
value |= (self.buffer[self.position + 3] << 24)
51+
value |= (self.buffer[self.position + 4] << 32)
52+
value |= (self.buffer[self.position + 5] << 40)
53+
value |= (self.buffer[self.position + 6] << 48)
54+
value |= (self.buffer[self.position + 7] << 56)
55+
else:
56+
value = self.buffer[self.position + 7]
57+
value |= (self.buffer[self.position + 6] << 8)
58+
value |= (self.buffer[self.position + 5] << 16)
59+
value |= (self.buffer[self.position + 4] << 24)
60+
value |= (self.buffer[self.position + 3] << 32)
61+
value |= (self.buffer[self.position + 2] << 40)
62+
value |= (self.buffer[self.position + 1] << 48)
63+
value |= (self.buffer[self.position] << 56)
64+
self.position += 8
65+
return value
66+
def decode_Int8(self):
67+
val = self.decode_8()
68+
if val == None:
69+
return None
70+
return ctypes.c_int8(val).value
71+
def decode_Int16(self):
72+
val = self.decode_16()
73+
if val == None:
74+
return None
75+
return ctypes.c_int16(val).value
76+
def decode_Int32(self):
77+
val = self.decode_32()
78+
if val == None:
79+
return None
80+
return ctypes.c_int32(val).value
81+
def decode_Int64(self):
82+
val = self.decode_64()
83+
if val == None:
84+
return None
85+
return ctypes.c_int64(val).value
86+
def decode_UInt8(self):
87+
val = self.decode_8()
88+
if val == None:
89+
return None
90+
return ctypes.c_uint8(val).value
91+
def decode_UInt16(self):
92+
val = self.decode_16()
93+
if val == None:
94+
return None
95+
return ctypes.c_uint16(val).value
96+
def decode_UInt32(self):
97+
val = self.decode_32()
98+
if val == None:
99+
return None
100+
return ctypes.c_uint32(val).value
101+
def decode_UInt64(self):
102+
val = self.decode_64()
103+
if val == None:
104+
return None
105+
return ctypes.c_uint64(val).value
106+
def decode_String(self):
107+
found = True
108+
length = 0
109+
found_position = 0
110+
for i in range(self.position, len(self.buffer)):
111+
length += 1
112+
if self.buffer[i] == 0:
113+
found = False
114+
break
115+
if found:
116+
return None
117+
value = ''.join(list(map(chr, self.buffer[self.position:self.position + length - 1])))
118+
self.position += length
119+
return value
120+
def decode_Bool(self):
121+
val = self.decode_8()
122+
if val == None:
123+
return None
124+
return ctypes.c_bool(val).value
125+
def frombuffer(self, buffer):
126+
assert(type(buffer) == bytearray or type(buffer) == bytes)
127+
self.buffer = memoryview(buffer)
128+
self.reset()
129+
def reset(self):
130+
self.position = 0

python/Serializer.py

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
import sys, ctypes
2+
class Serializer:
3+
def __init__(self, buffer):
4+
self.frombuffer(buffer)
5+
def __VerifyEntrySize(self, size):
6+
assert(type(size) == int)
7+
return len(self.buffer) < (self.position + size)
8+
def encode_8(self, value):
9+
assert(type(value) == int)
10+
assert(value < 0x100)
11+
12+
val = value & 0xff
13+
if self.__VerifyEntrySize(1):
14+
self.buffer += bytes(range((self.position + 1)-len(self.buffer)))
15+
self.buffer[self.position] = val
16+
self.position += 1
17+
def encode_16(self, value):
18+
assert(type(value) == int)
19+
assert(value < 0x10000)
20+
21+
val = [0,0]
22+
if sys.byteorder == "big":
23+
val[0] = value & 0xff
24+
val[1] = (value >> 8) & 0xff
25+
else:
26+
val[1] = value & 0xff
27+
val[0] = (value >> 8) & 0xff
28+
if self.__VerifyEntrySize(2):
29+
self.buffer += bytes(range((self.position + 2)-len(self.buffer)))
30+
self.buffer[self.position] = val[0]
31+
self.buffer[self.position + 1] = val[1]
32+
self.position += 2
33+
def encode_32(self, value):
34+
assert(type(value) == int)
35+
assert(value < 0x100000000)
36+
37+
val = [0,0,0,0]
38+
if sys.byteorder == "big":
39+
val[0] = value & 0xff
40+
val[1] = (value >> 8) & 0xFF
41+
val[2] = (value >> 16) & 0xFF
42+
val[3] = (value >> 24) & 0xFF
43+
else:
44+
val[3] = value & 0xff
45+
val[2] = (value >> 8) & 0xFF
46+
val[1] = (value >> 16) & 0xFF
47+
val[0] = (value >> 24) & 0xFF
48+
if self.__VerifyEntrySize(4):
49+
self.buffer += bytes(range((self.position + 4)-len(self.buffer)))
50+
self.buffer[self.position] = val[0]
51+
self.buffer[self.position + 1] = val[1]
52+
self.buffer[self.position + 2] = val[2]
53+
self.buffer[self.position + 3] = val[3]
54+
self.position += 4
55+
def encode_64(self, value):
56+
assert(type(value) == int)
57+
assert(value < 0x10000000000000000)
58+
59+
val = [0,0,0,0,0,0,0,0]
60+
if sys.byteorder == "big":
61+
val[0] = value & 0xff
62+
val[1] = (value >> 8) & 0xFF
63+
val[2] = (value >> 16) & 0xFF
64+
val[3] = (value >> 24) & 0xFF
65+
val[4] = (value >> 32) & 0xFF
66+
val[5] = (value >> 40) & 0xFF
67+
val[6] = (value >> 48) & 0xFF
68+
val[7] = (value >> 56) & 0xFF
69+
else:
70+
val[7] = value & 0xff
71+
val[6] = (value >> 8) & 0xFF
72+
val[5] = (value >> 16) & 0xFF
73+
val[4] = (value >> 24) & 0xFF
74+
val[3] = (value >> 32) & 0xFF
75+
val[2] = (value >> 40) & 0xFF
76+
val[1] = (value >> 48) & 0xFF
77+
val[0] = (value >> 56) & 0xFF
78+
79+
if self.__VerifyEntrySize(8):
80+
self.buffer += bytes(range((self.position + 8)-len(self.buffer)))
81+
self.buffer[self.position] = val[0]
82+
self.buffer[self.position + 1] = val[1]
83+
self.buffer[self.position + 2] = val[2]
84+
self.buffer[self.position + 3] = val[3]
85+
self.buffer[self.position + 4] = val[4]
86+
self.buffer[self.position + 5] = val[5]
87+
self.buffer[self.position + 6] = val[6]
88+
self.buffer[self.position + 7] = val[7]
89+
self.position += 8
90+
def encode_String(self, value):
91+
assert(type(value) == str)
92+
93+
length = len(value)+1
94+
val = list(map(ord, value))
95+
val.append(0)
96+
if self.__VerifyEntrySize(length):
97+
self.buffer += bytes(range((self.position + length)-len(self.buffer)))
98+
for i in range(length):
99+
self.buffer[self.position+i] = val[i]
100+
self.position += length
101+
def encode_Bytes(self, value):
102+
assert(type(value) == bytearray or type(value) == bytes)
103+
val = memoryview(value)
104+
length = len(val)
105+
if self.__VerifyEntrySize(length):
106+
self.buffer += bytes(range((self.position + length)-len(self.buffer)))
107+
for i in range(length):
108+
self.buffer[self.position+i] = val[i] & 0xff
109+
self.position += length
110+
def encode_Bool(self, value):
111+
assert(type(value) == bool)
112+
self.encode_8(int(bool(value)))
113+
def frombuffer(self, buffer):
114+
assert(type(buffer) == bytearray)
115+
self.buffer = bytearray(buffer)
116+
self.reset()
117+
def reset(self):
118+
self.position = 0

0 commit comments

Comments
 (0)