ctypes defines a number of primitive C compatible data types :
| ctypes type | C type | Python type |
|---|---|---|
| c_char |
char
|
1-character string |
| c_wchar |
wchar_t
|
1-character unicode string |
| c_byte |
char
|
int/long |
| c_ubyte |
unsigned char
|
int/long |
| c_short |
short
|
int/long |
| c_ushort |
unsigned short
|
int/long |
| c_int |
int
|
int/long |
| c_uint |
unsigned int
|
int/long |
| c_long |
long
|
int/long |
| c_ulong |
unsigned long
|
int/long |
| c_longlong |
__int64 or
long long
|
int/long |
| c_ulonglong |
unsigned __int64 or
unsigned long long
|
int/long |
| c_float |
float
|
float |
| c_double |
double
|
float |
| c_char_p |
char *
(NUL terminated)
|
string or
None
|
| c_wchar_p |
wchar_t *
(NUL terminated)
|
unicode or
None
|
| c_void_p |
void *
|
int/long
or None
|
All these types can be created by calling them with an optional initializer of the correct type and value:
>>> c_int()
c_long(0)
>>> c_char_p("Hello, World")
c_char_p('Hello, World')
>>> c_ushort(-3)
c_ushort(65533)
>>>
Since these types are mutable, their value can also be changed afterwards:
>>> i = c_int(42) >>> print i c_long(42) >>> print i.value 42 >>> i.value = -99 >>> print i.value -99 >>>
Assigning a new value to instances of the pointer types c_char_p, c_wchar_p, and c_void_p changes the memory location they point to, not the contents of the memory block (of course not, because Python strings are immutable):
>>> s = "Hello, World"
>>> c_s = c_char_p(s)
>>> print c_s
c_char_p('Hello, World')
>>> c_s.value = "Hi, there"
>>> print c_s
c_char_p('Hi, there')
>>> print s # first string is unchanged
Hello, World
>>>
You should be careful, however, not to pass them to functions
expecting pointers to mutable memory. If you need mutable memory
blocks, ctypes has a create_string_buffer function which creates
these in various ways. The current memory block contents can be
accessed (or changed) with the raw property; if you want to access
it as NUL terminated string, use the value property:
>>> from ctypes import *
>>> p = create_string_buffer(3) # create a 3 byte buffer, initialized to NUL bytes
>>> print sizeof(p), repr(p.raw)
3 '\x00\x00\x00'
>>> p = create_string_buffer("Hello") # create a buffer containing a NUL terminated string
>>> print sizeof(p), repr(p.raw)
6 'Hello\x00'
>>> print repr(p.value)
'Hello'
>>> p = create_string_buffer("Hello", 10) # create a 10 byte buffer
>>> print sizeof(p), repr(p.raw)
10 'Hello\x00\x00\x00\x00\x00'
>>> p.value = "Hi"
>>> print sizeof(p), repr(p.raw)
10 'Hi\x00lo\x00\x00\x00\x00\x00'
>>>
The create_string_buffer function replaces the c_buffer
function (which is still available as an alias), as well as the
c_string function from earlier ctypes releases. To create a
mutable memory block containing unicode characters of the C type
wchar_t use the create_unicode_buffer function.
See About this document... for information on suggesting changes.