免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3888 | 回复: 3
打印 上一主题 下一主题

[问题]如何打印一个c_void_p所指向的内容 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-20 20:54 |只看该作者 |倒序浏览
新手求解:

我定义了 m_string1 =create_string_buffer(b'\x11\x22\33\x44')

             m_string2 =create_string_buffer(b'\x11\x22\33\x44')
请问怎么能打印出m_string1地址中的内容?
我试验了print(repr(m_string1.value))和print(repr(m_string1.raw))都不行,如何能打印出11223344这样的效果?


如果想比较m_string1和m_string2是否相等要怎样写?
我试验了print(m_string1 is m_string2) 输出的结果是false ,我想应该是地址关系吧,请问要怎么写呢?

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2014-05-21 10:04 |只看该作者
我定义了 m_string1 =create_string_buffer(b'\x11\x22\33\x44')

             m_string2 =create_string_buffer(b'\x11\x22\33\x44')
请问怎么能打印出m_string1地址中的内容?
我试验了print(repr(m_string1.value))和print(repr(m_string1.raw))都不行,如何能打印出11223344这样的效果?

就是字节流打印成十六进制字符串吧,多种方法:
  1. Python 3.3.5 (default, Mar 11 2014, 15:08:59)
  2. [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
  3. Type "help", "copyright", "credits" or "license" for more information.
  4. >>> from ctypes import *
  5. >>> import codecs, binascii, base64
  6. >>> a = create_string_buffer(b'\x11\x22\x33\x44')
  7. >>> binascii.hexlify(a.value) # recommended
  8. b'11223344'
  9. >>> codecs.encode(a.value, 'hex_codec')
  10. b'11223344'
  11. >>> base64.b16encode(a.value)
  12. b'11223344'
  13. >>> bytes.fromhex(str(b'11223344', 'utf-8'))
  14. b'\x11"3D'
  15. >>> ''.join('{:02x}'.format(e) for e in a.value)
  16. '11223344'
  17. >>> bytes.fromhex('11223344')
  18. b'\x11"3D'
复制代码
如果想比较m_string1和m_string2是否相等要怎样写?
我试验了print(m_string1 is m_string2) 输出的结果是false ,我想应该是地址关系吧,请问要怎么写呢?

两者确实是地址关系,但不可能相等,因为create_string_buffer的功能就是创建mutable buffer,并以char *供C函数使用,意味着create_string_buffer总是copy参数的内容,然后内部新建buffer,也就是create_string_buffer总是返回一个新的Python对象,id不一样,那么is自然是false。m_string1和m_string2内部是不能直接访问的,是给C用的,用m_string1.value和m_string2.value比较吧。

论坛徽章:
0
3 [报告]
发表于 2014-05-21 21:16 |只看该作者
解决了,大神好强悍啊!!!!
我再问一个问题呗   
libc =cdll.LoadLibarary("libc.so.6"
a = create_string_buffer(b'\x11\x22\x33\x44')
libc.printf("%s",a)为什么什么都打印不出来呢?a不相当于一个地址吗?                                    
回复 2# timespace


   

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
4 [报告]
发表于 2014-05-21 21:38 |只看该作者
本帖最后由 timespace 于 2014-05-21 21:39 编辑

回复 3# hrgccx
printf的参数错误,Python 3中str对应C的const wchar_t*,bytes对应C的const char*:
  1. >>> libc.printf(b'%s\n', b'hello')
  2. hello
  3. 6
  4. >>> libc.printf('%s\n', b'hello')
  5. 0
复制代码
以前写过的一篇文章,有ctypes的例子http://blog.chinaunix.net/uid-190176-id-4128692.html
其它细节还是看标准库文档。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP