python c函数_python 调用 c 函数

python 调用 c 函数

最近对lua加密,用到了xxtea_encrypt,打算用python写个工具,直接python调用c.

// xxtea_Encrypt.cpp : 定义控制台应用程序的入口点。

//

#include "xxtea.h"

#include "Python.h"

PyObject* xxtea_encrypt(PyObject* self, PyObject* args)

{

unsigned char *data = NULL;

unsigned char *key = NULL;

unsigned int dataLen = 0;

unsigned int keyLen = 0;

unsigned int retLen = 0;

if (! PyArg_ParseTuple(args, "s#s#", &data,&dataLen,&key,&keyLen))

return NULL;

unsigned char * encrypt = xxtea_encrypt(data,dataLen,key,keyLen,&retLen);

return Py_BuildValue("s#",encrypt,retLen);

}

PyObject* xxtea_decrypt(PyObject* self, PyObject* args)

{

unsigned char *data = NULL;

unsigned char *key = NULL;

unsigned int dataLen = 0;

unsigned int keyLen = 0;

unsigned int retLen = 0;

if (! PyArg_ParseTuple(args, "s#s#", &data,&dataLen,&key,&keyLen))

return NULL;

unsigned char * decrypt = xxtea_decrypt(data,dataLen,key,keyLen,&retLen);

return Py_BuildValue("s#",decrypt,retLen);

}

static PyMethodDef xxteaMethods[] =

{

{"encrypt", xxtea_encrypt, METH_VARARGS, "xxteaEncrypt"},

{"decrypt", xxtea_decrypt, METH_VARARGS, "xxteaDecrypt"},

{NULL, NULL}

};

void initxxteaModule()

{

PyObject* m;

m = Py_InitModule("xxteaModule", xxteaMethods);

}

initxxteaModule python封装头,函数名为init+module名(Py_InitModule的第一个参数)。python导包时,会用到 import xxteaModule.

Py_InitModule第二个参数,c函数的相关描述信息。

struct PyMethodDef {

const char  *ml_name;   /* The name of the built-in function/method */

PyCFunction ml_meth;    /* The C function that implements it */

int         ml_flags;   /* Combination of METH_xxx flags, which mostly

describe the args expected by the C func */

const char  *ml_doc;    /* The __doc__ attribute, or NULL */

};

然后就是对c函数的封装,主要是c到python变量的一些转换.

最后说一下编译,这个网上很多都没有说清楚。写一个setup.py.

from distutils.core import setup, Extension

MOD = 'xxteaModule'

setup (name = MOD,ext_modules = [Extension(name=MOD, sources = ['xxtea_Encrypt.cpp','xxtea.cpp'])])

cmd 下执行命令:python setup.py build

将生成的build\lib.win32-2.7\xxteaModule.pyd拷贝到python DLLs目录中。

来看调用的例子。

import xxteaModule

def EncodeWithXxteaModule(filePath,key,signment):

all_the_text = ReadFile(filePath)

if all_the_text[:len(signment)] == signment :

return

#bak lua

BakFile(filePath,all_the_text)

encrypt = xxteaModule.encrypt(all_the_text,key)

signment = signment + encrypt

WriteFile(filePath,signment)

要注意的是,编译pyd时,机器必须安装vs2008,如果要使用其它编译器,改Python27\Lib\distutils\msvc9compiler.py 。关键代码:vc_env = query_vcvarsall(VERSION, plat_spec)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值