我需要快速处理 XOR 字节数组,在 Python 的一个变体中
for i in range(len(str1)): str1[i]=str1[i] ^ 55
工作很慢
我用 C 写了这个模块。我对 C 语言非常了解,在我没有写之前。
在一个变体中
PyArg_ParseTuple (args, "s", &str))
一切都按预期工作,但我需要使用而不是 ss* 因为元素可以包含嵌入的 null,但是如果我在调用 python 崩溃时将 s 更改为 s*
PyArg_ParseTuple (args, "s*", &str)) // crash
也许像我这样的初学者想使用我的示例作为开始编写他自己的东西,因此请在 Windows 上将本示例中使用的所有信息带上。在http://docs.python.org/dev/c-api/arg.html
页面上解析参数和构建值
test_xor.c
#include <Python.h>
static PyObject* fast_xor(PyObject* self, PyObject* args)
{
const char* str ;
int i;
if (!PyArg_ParseTuple(args, "s", &str))
return NULL;
for(i=0;i<sizeof(str);i++) {str[i]^=55;};
return Py_BuildValue("s", str);
}
static PyMethodDef fastxorMethods[] =
{
{"fast_xor", fast_xor, METH_VARARGS, "fast_xor desc"},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
initfastxor(void)
{
(void) Py_InitModule("fastxor", fastxorMethods);
}
test_xor.py
import fastxor
a=fastxor.fast_xor("World") # it works with s instead s*
print a
a=fastxor.fast_xor("Wo\0rld") # It does not work with s instead s*
编译.bat
rem use http://bellard.org/tcc/
tiny_impdef.exe C:\Python26\python26.dll
tcc -shared test_xor.c python26.def -IC:\Python26\include -LC:\Python26\libs -ofastxor.pyd
test_xor.py