By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
443,923 Members | 1,443 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 443,923 IT Pros & Developers. It's quick & easy.

ctypes and unsigned char*

P: n/a
Hi,

can anybody with ctypes experience tell me, how to handle a C function
that returns an unsigned char*? Obviously it is not a restype of
c_char_p.

Best regards,
Oliver

Aug 19 '07 #1
Share this Question
Share on Google+
5 Replies


P: n/a
ol************@gmail.com schrieb:
Hi,

can anybody with ctypes experience tell me, how to handle a C function
that returns an unsigned char*? Obviously it is not a restype of
c_char_p.
From the docs:

c_ubyte

Represents the C unsigned char datatype, it interprets the value as
small integer. The constructor accepts an optional integer initializer;
no overflow checking is done.

Diez
Aug 19 '07 #2

P: n/a
On 19 ago, 14:44, "oliver.andr...@gmail.com"
<oliver.andr...@gmail.comwrote:
Hi,

can anybody with ctypes experience tell me, how to handle a C function
that returns an unsigned char*? Obviously it is not a restype of
c_char_p.
Being signed or unsigned is not important here. But you have to
disambiguate "returns an unsigned char*"
- the function returns a string of bytes (unsigned char), null-
terminated.
- the function returns a pointer to a single byte.

In the first case, use a plain c_char_p - the individual "chars" are
already unsigned in Python (that is, ord(xxx[i]) is always positive)
In the second case, first define the pointer type:

c_ubyte_p = POINTER(c_ubyte)
your_function.restype = c_ubyte_p

--
Gabriel Genellina

Aug 19 '07 #3

P: n/a
On 19 Aug., 20:40, Gabriel Genellina <gagsl-...@yahoo.com.arwrote:
In the first case, use a plain c_char_p - the individual "chars" are
already unsigned in Python (that is, ord(xxx[i]) is always positive)
In the second case, first define the pointer type:

c_ubyte_p = POINTER(c_ubyte)
your_function.restype = c_ubyte_p
I will have to look into that. My function I want to wrap has the
following signature

unsigned char *MagickGetImageProfile(MagickWand *wand,const char
*name,
size_t *length)

Well, the first argument and the second are straight forward, and work
as expected. The last argument also works and it should take up the
length of the string (unsigned char *). If I now do

dll.MagickGetImageProfile.restype = c_char_p
result = dll.MagickGetImageProfile(wand, "8bim", byref(length))

result is either an empty string or a 3 bytes long string, while
length containes the correct length of 1086 bytes for example. I also
tried

dll.MagickGetImageProfile.restype = POINTER(c_ubyte)

with the same result. But maybe I should do some further debugging....

Best regards,
Oliver

Aug 20 '07 #4

P: n/a
En Mon, 20 Aug 2007 08:30:50 -0300, ol************@gmail.com
<ol************@gmail.comescribi�:
On 19 Aug., 20:40, Gabriel Genellina <gagsl-...@yahoo.com.arwrote:
>In the first case, use a plain c_char_p - the individual "chars" are
already unsigned in Python (that is, ord(xxx[i]) is always positive)
In the second case, first define the pointer type:

c_ubyte_p = POINTER(c_ubyte)
your_function.restype = c_ubyte_p

I will have to look into that. My function I want to wrap has the
following signature

unsigned char *MagickGetImageProfile(MagickWand *wand,const char
*name,
size_t *length)

Well, the first argument and the second are straight forward, and work
as expected. The last argument also works and it should take up the
length of the string (unsigned char *). If I now do
So, if I understand correctly, after the call, *length will contain the
length of the buffer pointed by the function result.
dll.MagickGetImageProfile.restype = c_char_p
result = dll.MagickGetImageProfile(wand, "8bim", byref(length))

result is either an empty string or a 3 bytes long string, while
length containes the correct length of 1086 bytes for example. I also
tried
If the result can contain nul bytes, you have to specify its size
explicitely (else it will be truncated at the first zero). Use the
string_at utility function:

result_str = string_at(result, length)

(That should work fine, I presume...)

--
Gabriel Genellina

Aug 23 '07 #5

P: n/a
On 23 Aug., 05:46, "Gabriel Genellina" <gagsl-...@yahoo.com.arwrote:
If the result can contain nul bytes, you have to specify its size
explicitely (else it will be truncated at the first zero). Use the
string_at utility function:

result_str = string_at(result, length)

(That should work fine, I presume...)
Thank a lot, that does exactly what I expected it to do.

Best regards,
Oliver

Aug 23 '07 #6

This discussion thread is closed

Replies have been disabled for this discussion.