ctypes and reading value under pointer passed as param of a callback

W

waldek

Hi,

I'm using C dll with py module and wanna read value (buffer of bytes)
returned in py callback as parameter passed to dll function.

--------------------------------------------------
def mycallback(data, size):
# how to read data buffer here ?
return 0

cbfunc = CFUNCTYPE(c_int, POINTER(c_uint8), c_int)

mydll = cdll.somedll
mdll.foo(cbfunct)
---------------------------------------------------------------

Question: How to get bytes from the buffer passed to mycallback ???
Let's assume that the buffer consist of 4 bytes 4 bytes 8 bytes.

I tried unpack("ii8s", data[0]) and nothing. I tried different ctypes
passed to callback and nothing.

Any sugestions ?

Thanks,
Waldek
 
T

Thomas Heller

waldek said:
Hi,

I'm using C dll with py module and wanna read value (buffer of bytes)
returned in py callback as parameter passed to dll function.

The callback receives a pointer instance. You can dereference the pointer
to read individual bytes in this way:
print data[0], data[5], data[42]
or use slicing to read a bunch of bytes:
print data[0:42]

So, you probably want something like this:
--------------------------------------------------
def mycallback(data, size):
# how to read data buffer here ? print data[:size]
return 0

cbfunc = CFUNCTYPE(c_int, POINTER(c_uint8), c_int)

mydll = cdll.somedll
mdll.foo(cbfunct)
---------------------------------------------------------------

Question: How to get bytes from the buffer passed to mycallback ???
Let's assume that the buffer consist of 4 bytes 4 bytes 8 bytes.

I tried unpack("ii8s", data[0]) and nothing. I tried different ctypes
passed to callback and nothing.

Thomas
 
W

waldek

waldekschrieb:
I'm using C dll with py module and wanna read value (buffer of bytes)
returned in py callback as parameter passed to dll function.

The callback receives a pointer instance. You can dereference the pointer
to read individual bytes in this way:
print data[0], data[5], data[42]
or use slicing to read a bunch of bytes:
print data[0:42]

So, you probably want something like this:

print data[:size]
cbfunc = CFUNCTYPE(c_int, POINTER(c_uint8), c_int)
mydll = cdll.somedll
mdll.foo(cbfunct)
---------------------------------------------------------------
Question: How to get bytes from the buffer passed to mycallback ???
Let's assume that the buffer consist of 4 bytes 4 bytes 8 bytes.
I tried unpack("ii8s", data[0]) and nothing. I tried different ctypes
passed to callback and nothing.

Thomas

Cool, works fine now.

.... and how to convert a list of bytes to py string or int ??

i.e
data[:4] -> py int
data[4:8] -> py int
data[8:] -> py strng

I tried unpack and unpack_from but the buff should be an string or
buffer not a list of bytes as data is.

any suggestions?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,982
Messages
2,570,190
Members
46,736
Latest member
zacharyharris

Latest Threads

Top