- 论坛徽章:
- 0
|
前此天发了一个贴子关于怎么获得指向byte数组的指针,这个问题已得到解决。
http://bbs.chinaunix.net/thread-4125023-1-1.html
但现在出现新问题,我希望给C函数传入指针,能修改python中的数组,试了几次都没成功,希望大神帮忙。问题如下:
C函数如下:
void mytest(const unsigned char* in, const unsigned int inlen, unsigned char* out)
{
int i;
for (i = 0;i < inlen;i++)
{
*out++ = *in++;
}
}
编译生成libfun.so
然后在python3中如下测试都没解决:
[root@kyle ~]# python3
Python 3.3.2 (default, Aug 9 2013, 11:39:3
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os,sys
>>> from ctypes import *
>>> packet = b'abcdefgh'
>>> libfun = cdll.LoadLibrary('./libfun.so')
>>> pinstr = c_char_p(packet)
>>> libfun.mytest("mmmm",4,byref(pinstr))
4
>>> packet
b'abcdefgh'
>>> libfun.mytest("mmmm",4,cast(packet,POINTER(c_ubyte)))
4
>>> packet
b'm\x00\x00\x00efgh'
>>> packet = b'abcdefgh'
>>> libfun.mytest("mmmm",4,cast(packet,POINTER(c_char_p)))
4
>>> packet
b'm\x00\x00\x00efgh'
>>> packet = b'abcdefgh'
>>> libfun.mytest("mmmm",4,cast(packet[2:],POINTER(c_char_p)))
>>> packet
b'abcdefgh'
>>> packet = b'abcdefgh'
>>> libfun.mytest("mmmm",4,pinstr)
段错误 (core dumped)
如上,有四个问题:
1. 墨绿色部分为啥packet值没变?
2. 如上蓝色部分字体,为啥结果为b'm\x00\x00\x00efgh',而不是想象中的b'mmmmefgh'呢
3. 对于如上红色部分字体,为啥packet值没有变化,原因我想应该在于packet[2:]的用法导致新生成了一个packet,c函数只对新生成的packet产生作用,那么我该如何来修改这段程序呢?
4. 最后为啥会core dump?
这最后问题归结为对于如何给C函数值指针不清楚,不知道byref, cast,POINTER等的用法,有哪位大神给举例解释一下,谢谢。 |
|