Python ctypesを使用して共有ライブラリから浮動小数点のバッファをPython文字列に取得する
-
22-08-2019 - |
質問
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
からのバイトsrc
にdst
.dst
そしてsrc
ポインタに変換できる整数または ctypes インスタンスである必要があります。
上記のスニペットを実行した後、 rgb_buffer.value
最初までの内容を返します '\0'
. 。すべてのバイトを Python 文字列として取得するには、全体をスライスします。 buffer_contents = rgb_buffer[:]
.
他のヒント
これは、しばらくしているが、あなたはc_float_pをしたい場合:
c_float_p = ctypes.POINTER(ctypes.c_float)
読書BastardSaintの答え、あなただけの生データをしたいが、私はあなたが回避策としてc_float_pを持っていないためにことをやっているかどうかわからなかった。