私はPython 3でそれを使用できるように、mcryptライブラリをラップするためにCPythonにCython拡張を書き込もうとしています。しかし、私は使用しようとしている間segfault mcrypt APIの1つ。CythonのバイトからCのchar *
失敗しているコードは:
def _real_encrypt(self, source):
src_len = len(source)
cdef char* ciphertext = source
cmc.mcrypt_generic(self._mcStream, <void *>ciphertext, src_len)
retval = source[:src_len]
return retval
ここで、IはCythonドキュメントを理解する方法、3行目の割り当てはCにバッファ(Pythonの3オブジェクト)の内容をコピーする必要があります文字列ポインタ。私は、これはまた、それがメモリを割り当てることを意味することを理解だろうが、私はこの変更をしたとき:
def _real_encrypt(self, source):
src_len = len(source)
cdef char* ciphertext = <char *>malloc(src_len)
ciphertext = source
cmc.mcrypt_generic(self._mcStream, <void *>ciphertext, src_len)
retval = source[:src_len]
return retval
は、それはまだセグメンテーションフォルトで墜落しました。 mcrypt_genericの内部でクラッシュしていますが、プレーンなCコードを使用するとうまく動作するようになりました。そこでCythonがCのデータをどのように扱っているのかよく分かりません。
ありがとうございました!
ETA:問題は私の一部のバグでした。私はあまりにも多くの時間のために目を覚ました後、これについて取り組んでいました。私が今持っているコード、作品は、次のとおりです。
def _real_encrypt(self, source):
src_len = len(source)
cdef char *ciphertext = <char *>malloc(src_len)
cmc.strncpy(ciphertext, source, src_len)
cmc.mcrypt_generic_init(self._mcStream, <void *>self._key,
len(self._key), NULL)
cmc.mcrypt_generic(self._mcStream, <void *>ciphertext,
src_len)
retval = ciphertext[:src_len]
cmc.mcrypt_generic_deinit(self._mcStream)
return retval
それが戻り値に暗号化した後、第2のコピーを行うためのコピーを作成してそれは、おそらく世界で最も効率的なコードではありません。しかし、それを避けることができるかどうかはわかりません。なぜなら、新しく割り当てられたバッファを取り、それをPythonのバイトコードとして返すことが可能かどうかわからないからです。しかし、私は実際の機能を持っているので、私はブロックごとの方法も実装するつもりです。そのため、暗号化または復号化のためのブロックの反復可能性を提供し、ソース全体を持たなくてもできるようになりますと宛先すべてを一度にすべてのメモリに格納することができます。その方法では、巨大なファイルを暗号化/復号化することが可能になります...
助けてくれてありがとう、みんな!
def _real_encrypt(self,char* src):
...
...これは、私が多忙の間にプログラムしようとしていたので、私がおそらく昨晩寝るべきだったのでしょう。確かに、それを動作させるためには、strncpy(入力でNULLバイトの可能性があるために使用した)を呼び出してから、mcrypt_genericへの呼び出しを行い、出力をPythonバイトレットにコピーし、一時バッファ、およびリターン。この答えをありがとう、それは正しい方向に私を指摘した。 –
!!! 'strncpy'は、入力にNULLバイトが有効になる可能性がある場合には**あなたには役立ちません。つまり、入力は実際には文字列ではなく、一連のバイトであることを意味します。 'memcpy'などを使ってください。 –
ああ、あなたは間違いない。 nは「最大」です。やばい。ああ、ああ、うんざり。私は別の質問に投稿したバグを指摘したばかりかもしれないと思う:http://stackoverflow.com/questions/4451977/data-corruption-wheres-the-bug –