Guest User

Untitled

a guest
Jul 17th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.22 KB | None | 0 0
  1. #!/usr/bin/env python
  2. from struct import pack, unpack
  3.  
  4. def vb_encode(number):
  5. bytes = []
  6. while True:
  7. bytes.insert(0, number % 128)
  8. if number < 128:
  9. break
  10. number /= 128
  11. bytes[-1] += 128
  12. return pack('%dB' % len(bytes), *bytes)
  13.  
  14. def vb_decode(bytestream):
  15. n = 0
  16. numbers = []
  17. bytestream = unpack('%dB' % len(bytestream), bytestream)
  18. for byte in bytestream:
  19. if byte < 128:
  20. n = 128 * n + byte
  21. else:
  22. n = 128 * n + (byte - 128)
  23. numbers.append(n)
  24. n = 0
  25. return numbers
  26.  
  27. # test
  28. if __name__ == '__main__':
  29. # format() require python 2.6 or more.
  30. def test_vb_encode(number, ok):
  31. bytestream = vb_encode(number)
  32. assert ''.join([format(b, '08b') for b in unpack('%dB' % len(bytestream), bytestream)]) == ok
  33. print "test ok. %s -> %s" % (number, ok)
  34.  
  35. test_vb_encode(1, '10000001')
  36. test_vb_encode(5, '10000101')
  37. test_vb_encode(127, '11111111')
  38. test_vb_encode(128, '00000001' + '10000000')
  39. test_vb_encode(129, '00000001' + '10000001')
  40.  
  41. import sys, random
  42. for i in xrange(1000):
  43. n = random.randint(0, sys.maxint)
  44. assert vb_decode(vb_encode(n))[0] == n
Add Comment
Please, Sign In to add comment