Wednesday, April 27, 2011

7 Bit Integer compression, in Python.

def decode7bit(bytes):
bytes = list(bytes)
value = 0
shift = 0
while True:
byteval = ord(bytes.pop(0))
if(byteval & 128) == 0: break
value |= ((byteval & 0x7F) << shift)
shift += 7
return (value | (byteval << shift))


def encode7bit(value):
temp = value
bytes = ""
while temp >= 128:
bytes += chr(0x000000FF & (temp | 0x80))
temp >>= 7
bytes += chr(temp)
return bytes


x = encode7bit(345)
print decode7bit(x)

3 comments:

Richard Jones said...

I have code very similar to this in my SMS PDU transcoder library (which I really must release some day as it's way more complete than anything else out there). Yay for looooong ints :-)

DrKJam said...

Here aer some other places where these methods are used :-

FAST - http://www.fixprotocol.org/documents/3066/FAST%20Specification%201%20x%201.pdf
Protocol Buffers - http://code.google.com/apis/protocolbuffers/docs/encoding.html

Jean-Paul Calderone said...

And another implementation: http://twistedmatrix.com/trac/browser/trunk/twisted/spread/banana.py?rev=30752#L24 and a variation which tries to be faster: http://twistedmatrix.com/trac/attachment/ticket/2310/banana_speed.2.py

Popular Posts