SWIG を使用して、ioctl() を使用して次のような構造を設定する単純なライブラリをラップしようとしています。
struct data
{
header* hdr;
void* data;
size_t len;
};
dataはバッファへのポインタで、lenはそのバッファの長さです。
データを Python 文字列 (または配列)に変換する方法がわかりません。さらに、デストラクタでそのバッファを解放する方法が必要です。任意の提案をいただければ幸いです。
swig は「cdata.i」という名前のモジュールを提供します。これをインターフェイス定義ファイルに含める必要があります。
これを含めると、cdata() と memmove() の 2 つの関数が得られます。void * とバイナリ データの長さを指定すると、cdata() はそれをターゲット言語の文字列型に変換します。memmove() はその逆です。文字列型を指定すると、文字列の内容 (埋め込まれた null バイトを含む) を C void* 型にコピーします。
このモジュールを使用すると、バイナリ データの処理が非常に簡単になります。これがあなたが必要とするものであることを願っています。
Q のタイトルで「または何か他のもの」と言っているので、ctypesvoid*
を使用することを選択した場合は、c_void_p
(ctypes の基本的なデータ型の 1 つ) で表現でき、C ランタイム ライブラリのfree
やなどの関数にアクセスできますmemcpy
(限り後者は DLL / .so 動的ライブラリとして利用できますが、最近ではかなり広く当てはまります)memcpy
データを格納できる可変文字バッファーを取得するには、 create_string_bufferを使用します。
もちろん、代わりに Python C API を使用することもできます -- PyByteArray_FromStringAndSizeは、この場合、あなたと長さからバイト配列のコピーを作成するために使用するものです(もちろん、それは単なる C コードであるため、必要に応じて直接void*
呼び出します)free
とりあえず)。
考慮すべきもう 1 つの可能性はCythonです。これは、Python 拡張機能を記述し、Cython コンパイラが Cython ソースからコンパイル可能な C コードを生成できるように設計された Python に似た言語です。Cython では、次のようstruct
になります。
cdef struct data:
void* hdr
void* data
unsigned int* len
面倒な宣言をしたくないと仮定するとheader
(つまり、ここではそれだけdata
でlen
問題です) --size_t
は、現時点では Cython の一部ではないと思います (私は間違っている可能性があります。彼らは何かを追加し続けます; -)、しかしunsigned int
おそらくできるでしょう。
申し訳ありませんが、私が SWIG を本格的に使用してからかなり時間が経ちました (これらすべての優れた代替手段があるのに) -- タイトルの魅力的な「またはその他」の句がなかったら、Q をスキップしていたでしょう;-)。