Python ctypesを使用して共有ライブラリから浮動小数点のバッファをPython文字列に取得する

StackOverflow https://stackoverflow.com/questions/704777

質問

Python ctypes を使用して、共有ライブラリからこれら 2 つの C 関数を使用しようとしています。

bool decompress_rgb(unsigned char *data, long dataLen, int scale)
float* getRgbBuffer()

最初の機能は正常に動作しています。共有ライブラリにデバッグ コードを入れて入力をチェックするとわかります。

問題はデータの取り出しです。RGB バッファは浮動小数点数へのポインタであり (当然のことですが)、このポインタはアプリケーションの存続期間中は一定のままです。したがって、画像を解凍したいときは常に、 decompress_rgb 次に、によって示された場所に何があるかを確認する必要があります getRgbBuffer. 。バッファサイズが (720 * 288 * sizeof(float)) であることはわかっているので、これがどこかで影響を与える必要があると思います。

ないよ c_float_p と入力したので、これを試してみようと思いました:

getRgbBuffer.restype = c_char_p

それから私はこうします:

ptr = getRgbBuffer()
print "ptr is ", ptr

これは単に出力します:

ptr = 3078746120

これは内容ではなく実際のアドレスだと思いますが、ポインタの逆参照に成功して内容を取得できたとしても、それは最初の文字だけです。

バッファ全体の内容を Python 文字列に取得するにはどうすればよいですか?

編集: 変更する必要がありました:

getRgbBuffer.restype = c_char_p

getRgbBuffer.restype = c_void_p

しかし、その後、BastardSaintの答えはうまくいきました。

役に立ちましたか?

解決

完全にテストされていませんが、次のようなものだと思います。

buffer_size = 720 * 288 * ctypes.sizeof(ctypes.c_float)
rgb_buffer = ctypes.create_string_buffer(buffer_size) 
ctypes.memmove(rgb_buffer, getRgbBuffer(), buffer_size)

鍵となるのは、 ctypes.memmove() 関数。から ctypes ドキュメント:

memmove(dst, src, count)
標準の C memmove ライブラリ関数と同じです。コピー count からのバイト srcdst. dst そして src ポインタに変換できる整数または ctypes インスタンスである必要があります。

上記のスニペットを実行した後、 rgb_buffer.value 最初までの内容を返します '\0'. 。すべてのバイトを Python 文字列として取得するには、全体をスライスします。 buffer_contents = rgb_buffer[:].

他のヒント

私はctypesのを使用して、私は十分に便利な「*ダブル」これを試しに戻って何かを持っていないので、

これは、しばらくしているが、あなたはc_float_pをしたい場合:

c_float_p = ctypes.POINTER(ctypes.c_float)

読書BastardSaintの答え、あなただけの生データをしたいが、私はあなたが回避策としてc_float_pを持っていないためにことをやっているかどうかわからなかった。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top