ctypesはたくさんのCと互換性のあるデータ型を定義しています :
| ctypesの型 | Cの型 | Pythonの型 |
|---|---|---|
| c_char |
char
|
1文字の 文字列 |
| c_wchar |
wchar_t
|
1文字の ユニコード文字列 |
| c_byte |
char
|
整数/長整数 |
| c_ubyte |
unsigned char
|
整数/長整数 |
| c_short |
short
|
整数/長整数 |
| c_ushort |
unsigned short
|
整数/長整数 |
| c_int |
int
|
整数/長整数 |
| c_uint |
unsigned int
|
整数/長整数 |
| c_long |
long
|
整数/長整数 |
| c_ulong |
unsigned long
|
整数/長整数 |
| c_longlong |
__int64 or
long long
|
整数/長整数 |
| c_ulonglong |
unsigned __int64 or
unsigned long long
|
整数/長整数 |
| c_float |
float
|
浮動小数点数 |
| c_double |
double
|
浮動小数点数 |
| c_char_p |
char *
(NUL 終端)
|
文字列または
None
|
| c_wchar_p |
wchar_t *
(NUL 終端)
|
ユニコードまたは
None
|
| c_void_p |
void *
|
整数/長整数
またはNone
|
これら全ての型はその型を呼び出すことによって作成でき、オプションとして型と値が合っている 初期化子を指定することができます:
>>> c_int()
c_long(0)
>>> c_char_p("Hello, World")
c_char_p('Hello, World')
>>> c_ushort(-3)
c_ushort(65533)
>>>
これらの型は変更可能であり、値を後で変更することもできます:
>>> i = c_int(42) >>> print i c_long(42) >>> print i.value 42 >>> i.value = -99 >>> print i.value -99 >>>
新しい値をポインタ型c_char_p、c_wchar_p、 およびc_void_pのインスタンスへ代入すると、 メモリブロックの内容ではなく指しているメモリ位置が変わります、 (もちろんできません。なぜなら、Python文字列は変更不可能だからです):
>>> 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 # 最初の文字列は変更されていない
Hello, World
>>>
しかし、変更可能なメモリを指すポインタであることを想定している関数へ
それらを渡さないように注意すべきです。もし変更可能なメモリブロックが必要なら、
ctypesにはcreate_string_buffer関数があり、いろいろな方法で作成する
ことできます。
現在のメモリブロックの内容はrawプロパティを使ってアクセス
(あるいは変更)することができます。もし現在のメモリブロックにNUL終端文字列として
アクセスしたいなら、valueプロパティを使ってください:
>>> from ctypes import *
>>> p = create_string_buffer(3) # 3バイトのバッファを作成、NULで初期化される
>>> print sizeof(p), repr(p.raw)
3 '\x00\x00\x00'
>>> p = create_string_buffer("Hello") # NUL終端文字列を含むバッファを作成
>>> print sizeof(p), repr(p.raw)
6 'Hello\x00'
>>> print repr(p.value)
'Hello'
>>> p = create_string_buffer("Hello", 10) # 10バイトのバッファを作成
>>> 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'
>>>
create_string_buffer関数は初期のctypesリリースにあったc_string関数
だけでなく、(エイリアスとしてはまだ利用できる)c_buffer関数をも置き換えるものです。
Cの型wchar_tのユニコード文字を含む変更可能なメモリブロックを作成するには、
create_unicode_buffer関数を使ってください。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。