from cStringIO import StringIO import struct HEADER_FMT = '!L' HEADER_SIZE = 4 class NSBuffer(object): def __init__(self): self.buf = StringIO() def write(self, s): self.buf.write(s) def extract(self): v = self.buf.getvalue() res = [] while len(v) >= HEADER_SIZE: l, = struct.unpack(HEADER_FMT, v[:HEADER_SIZE]) truncated = v[HEADER_SIZE:] if len(truncated) >= l: res.append(truncated[:l]) v = truncated[l:] else: break self.buf = StringIO() self.buf.write(v) return res def ns_encode(s): return struct.pack(HEADER_FMT, len(s)) + s