python调用c函数时返回含Null的char*

asd2314asd 2011-09-30 12:00:49
如题
某c++函数 返回char*
内容为"Hello\x00World!!!"
已知长度
python如何接受?
ctypes,swig都直接映射成以NULL结尾的字符串(这个设计真不爽)
...全文
327 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
iambic 2011-10-01
  • 打赏
  • 举报
回复
找到了几个可以嵌入C的python库:
http://scipy.org/Weave
http://pyinline.sourceforge.net/
http://www.cs.tut.fi/~ask/cinpy/
忘了以前看的是哪个了。没实际用过,所以都没印象了。
asd2314asd 2011-10-01
  • 打赏
  • 举报
回复
第一招没问题,万分抱歉
If you need mutable memory blocks, ctypes has a create_string_buffer() function which creates these in various ways.
这句话贴在doc一个十分隐蔽的地方,开始没看到,只看到
ctypes.create_string_buffer(init_or_size[, size]):
This function creates a mutable character buffer. The returned object is a ctypes array of c_char.
看来的确非常高效
再次深表感谢
iambic 2011-10-01
  • 打赏
  • 举报
回复
第一方法你贴个完整的错误。EOL while scanning string literal看起来像是python语法的问题。你把代码和错误都贴出来看下。

传一个字符串数组进去,不需要byref,直接用ctypes.create_string_buffer就可以了,非常高效。

Python里可以直接写C(C++够呛),我以前见过两个,需要机器上有gcc。但是忘记名字了……等会有空我看下能不能找到了。
asd2314asd 2011-10-01
  • 打赏
  • 举报
回复
首先万分感谢
然后我错了,不小心多了一对""
再然后耽误您时间了,不好意思

第一种方法通不过
EOL while scanning string literal
我记得貌似POINTER(ctypes.c_char)跟c_char_p没区别
第二种方法用数组强行接收没问题
传引用好主意,本以为c里没引用传递,但byref貌似可以传进去
不知有没有可以直接在Python里写c或c++的库?就像Pyasm在Python里写汇编一样?
iambic 2011-09-30
  • 打赏
  • 举报
回复
方法很多,比如:
dll.rt.restype = ctypes.POINTER(ctypes.c_char)
print ''.join(dll.rt(...)[:14])

或者:
dll.rt.restype = ctypes.POINTER(ctypes.c_char*14)
print dll.rt(...)[0].raw

也可以考虑传一个buffer进去,而不是从dll里拿返回值。

让你贴代码就贴代码,有用没用我心里有数。但你要是贴这种编译都通不过的代码,就是在浪费别人的时间了。
asd2314asd 2011-09-30
  • 打赏
  • 举报
回复
size=ctypes.c_int(14)
str=ctypes.c_char_p(""Hello\x00World!!!"")
dll=ctypes.CDLL("pix.dll")
dll.rt.restype = ctypes.c_char_p
dll.rt.argtypes=[ctypes.c_char_p,c_int]
newstr=ctypes.c_char_p(dll.rt(str,size)).value
我只是举个例子
贴出来有什么用吗?
iambic 2011-09-30
  • 打赏
  • 举报
回复
你的ctypes代码怎么写的?贴出来看下。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧