> dtype = ord(rawdata[0]) > dcount = struct.unpack("!H",rawdata[1:3]) > if dtype == 1: > fmtstr = "!" + "H"*dcount > elif dtype == 2: > fmtstr = "!" + "f"*dcount > rlen = struct.calcsize(fmtstr) > > data = struct.unpack(fmtstr,rawdata[3:3+rlen]) > > leftover = rawdata[3+rlen:]
Unfortunately, that does not work in the example. We have a message type (an integer), and a variable-length string. So how do you compute the struct format for that? >> Sure. You would normally have a struct such as >> >> struct TLV{ >> char type; >> char length; >> char *data; >> }; >> >> However, the in-memory representation of that struct is *not* >> meant to be sent over the wire. In particular, the character >> pointer has no meaning outside the address space, and is thus >> not to be sent. > > Well if it's not representing the layout of the data we're > trying to deal with, then it's irrelevent. We are talking > about how convert python objects to/from data in the > 'on-the-wire' format, right? Right: ON-THE-WIRE, not IN MEMORY. In memory, there is a pointer. On the wire, there are no pointers. > Like this? > >>>> def encode(type,length,value): > ... return chr(type)+chr(length)+value > ... >>>> print encode('float', 1, 3.14159) > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > File "<stdin>", line 2, in encode > TypeError: an integer is required No: py> CONNECT_REQUEST=17 py> payload="call me" py> encode(CONNECT_REQUEST, len(payload), payload) '\x11\x07call me' Regards, Martin -- http://mail.python.org/mailman/listinfo/python-list