-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvarint.py
54 lines (47 loc) · 1.43 KB
/
varint.py
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
43
44
45
46
47
48
49
50
51
52
53
54
from construct import Construct, UBInt8
class VarInt(Construct):
def _parse(self, stream, ctx):
val = 0
base = 1
exit = False
while exit is False:
b = UBInt8('b')._parse(stream, ctx)
if b < 128:
exit = True
else:
b -= 128
val += b * base
base *= 128
return val
def _build(self, obj, stream=None, ctx=None):
number = obj
data = ''
exit = False
while exit is False:
digit = number % 128
if digit == number:
exit = True
else:
number /= 128
digit += 128
data += chr(digit)
if stream is not None:
stream.write(data)
else:
return data
def _sizeof(self, ctx):
pass
if __name__ == '__main__':
testvals = (("\x01", 1), ("\xac\x02", 300))
for testval in testvals:
testvarint, testnumber = testval
checkvarint = VarInt('test').build(testnumber)
if checkvarint == testvarint:
print 'success with %d' % testnumber
else:
print 'failure: %s %s' % (checkvarint, testvarint)
checknumber = VarInt('test').parse(testvarint)
if checknumber == testnumber:
print 'success with %d' % testnumber
else:
print 'failure: %d %d' % (checknumber, testnumber)