Eg to make a struct from a string >>> a = cast(packet, POINTER(A)).contents >>> a.x 258 >>> Or (this is identical to your method) >>> a = A() >>> a.x 0 >>> memmove(addressof(a), packet, sizeof(a)) 3083811008L >>> a.x 258 I think the second of those methods is promoted by the ctypes documentation. I'm not sure about the lifetimes of the .contents in the first method! And the reverse >>> string_at(addressof(a), sizeof(a)) '\x02\x01\x00\x00' >>>