[ctypes-users] ctypes: buffers and memoryviews
Brought to you by:
theller
From: Stephen <ste...@op...> - 2013-07-05 13:11:07
|
Debian 3.9.6-1 x86_64 GNU/Linux Python 3.2.4 (default, May 8 2013, 20:55:18) [GCC 4.7.3] on linux2 >>> import ctypes >>> ctypes.__version__ '1.1.0' Hello, In python 2.x I would use ctypes to create a structure and write a buffer for transmission of a message. I would use a recipe I found online that followed the format class CMD_HEADER(ctypes.Structure): _pack_ = 2 _fields_ = [ ('command', ctypes.c_ushort ), ('length', ctypes.c_uint ) ] def CreateTxBuffer(self): return buffer(self)[:] def receiveSome(self, bytes): fit = min(len(bytes), ctypes.sizeof(self)) ctypes.memmove(ctypes.addressof(self), bytes, fit) This has worked for me well. Now python3 has removed buffer, and seems I should use memoryview instead I can't seem to find a python 3 recipe online to achieve the same so I came up with the following modification to CreateTxBuffer def CreateTxBuffer(self): return memoryview(self) Seems to work on surface, but I'm having all sorts of trouble using the resultant memoryview. for the following sample program import ctypes from binascii import hexlify class CMD_HEADER(ctypes.Structure): _pack_ = 2 _fields_ = [ ('command', ctypes.c_ushort ), ('length', ctypes.c_uint ) ] def CreateTxBuffer(self): return memoryview(self) def receiveSome(self, bytes): fit = min(len(bytes), ctypes.sizeof(self)) ctypes.memmove(ctypes.addressof(self), bytes, fit) # create a ctype struct and populate it with data msg = CMD_HEADER() msg.command = 0x123 msg.length=2 # Get access to the underlying message structure data (should be a memory view) txbuf = msg.CreateTxBuffer() #create a bytearry with same data then create memoryview to that byte array bb = bytearray( txbuf ) mv = memoryview(bb) print("type={0} , len={1} , shape={2}, buf={3}".format(type(txbuf), len(txbuf), txbuf.shape, hexlify(txbuf)) ) print("type={0} , len={1} , shape={2}, buf={3}".format(type(mv), len(mv), mv.shape, hexlify(mv)) ) I get the following output, indicating the memory view I get from ctypes is behaving differently than what I thought it should. type=<class 'memoryview'> , len=1 , shape=None, buf=b'230102000000' type=<class 'memoryview'> , len=6 , shape=(6,), buf=b'230102000000' Notice the 'ctypes' memoryview I dont have correct len or shape I'm getting out of my depth here, not really sure what I've done wrong. So I'd like to ask is there a correct way to create the tx buffer in python 3, obviously my method is not correct. Thanks Steve |