import struct LIMIT = 1024 def encode(payload): if len(payload) > LIMIT: raise ValueError("frame too large") return struct.pack("!I", len(payload)) + payload def decode(buffer): if len(buffer) < 4: return None size = struct.unpack("!I", buffer[:4])[0] if size > LIMIT: raise ValueError("frame too large") if len(buffer) < 4 + size: return None return buffer[4:4 + size], buffer[4 + size:] assert decode(encode(b"hello")) == (b"hello", b"") assert decode(encode(b"hello")[:6]) is None