# the decoder works off a reader # the encoder returns bytearray def bytes2hex(b): if type(b) in (str, unicode): return "".join([hex(ord(c))[2:].zfill(2) for c in b]) else: return bytes2hex(b.decode()) # expects uvarint64 (no crazy big nums!) def uvarint_size(i): if i == 0: return 0 for j in xrange(1, 8): if i < 1< int(0xF0) else False if negate: size = size -0xF0 i = decode_big_endian(reader, size) if negate: i = i*(-1) return i def encode_string(s): size = encode_varint(len(s)) return size + bytearray(s) def decode_string(reader): length = decode_varint(reader) return str(reader.read(length)) def encode_list(s): b = bytearray() map(b.extend, map(encode, s)) return encode_varint(len(s)) + b def encode(s): if s == None: return bytearray() if isinstance(s, int): return encode_varint(s) elif isinstance(s, str): return encode_string(s) elif isinstance(s, list): return encode_list(s) else: print "UNSUPPORTED TYPE!", type(s), s import binascii if __name__ == '__main__': ns = [100,100,1000,256] ss = [2,5,5,2] bs = map(encode_big_endian, ns,ss) ds = map(decode_big_endian, bs,ss) print ns print [i[0] for i in ds] ss = ["abc", "hi there jim", "ok now what"] e = map(encode_string, ss) d = map(decode_string, e) print ss print [i[0] for i in d]