python中char *的问题

时间:2011-01-13 09:13:10

标签: c++ python

我刚刚包装了一个标题(.h)文件并创建了.so以将其用作python中的模块。 Encrypt函数接受char * bb,然后使用memcpy()填充它。如果我想从c代码调用此函数,我必须这样做(char * bb =(char *)new char [200]; Encrypt(...,...,...,bb);)。如何从python中调用它?如何在python中等效(char * bb =(char *)new char [200];)?

int Encrypt (string key, string iv, string plaintext, char* bb)
{
std::string ciphertext;

CryptoPP::AES::Encryption aesEncryption((byte *)key.c_str(), CryptoPP::AES::DEFAULT_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption( aesEncryption, (byte *)iv.c_str() );

CryptoPP::StreamTransformationFilter stfEncryptor(cbcEncryption, new CryptoPP::StringSink( ciphertext ) );
stfEncryptor.Put( reinterpret_cast<const unsigned char*>( plaintext.c_str() ), plaintext.length() );
stfEncryptor.MessageEnd();

memcpy(bb,ciphertext.c_str(), ciphertext.size());
return ciphertext.size();
};

从c:

调用Encrypt()
char* bbb = (char*) new char [400];
int sizec = Encrypt(key, iv, plaintext, bbb);

我在python中使用了create_string_buffer(“”,400),但它不起作用。

2 个答案:

答案 0 :(得分:2)

恕我直言你不能直接从python中调用C函数,但编写python模块很容易,请参阅http://docs.python.org/extending/extending.html

修改

ctype模块允许您直接调用普通C函数。

检查此网址以获取答案:http://docs.python.org/library/ctypes.html#passing-pointers-or-passing-parameters-by-reference

答案 1 :(得分:0)

我认为你需要在“char * bb”的末尾插入'\ 0'(终止空字符)。如果您的数据是字符串而不是二进制,请使用strcpy。 对不起,不是你的答案,但你可能会出现内存错误。