hrgccx 发表于 2014-05-20 20:54

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

新手求解:

我定义了 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 ,我想应该是地址关系吧,请问要怎么写呢?

timespace 发表于 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这样的效果?
就是字节流打印成十六进制字符串吧,多种方法:Python 3.3.5 (default, Mar 11 2014, 15:08:59)
on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import *
>>> import codecs, binascii, base64
>>> a = create_string_buffer(b'\x11\x22\x33\x44')
>>> binascii.hexlify(a.value) # recommended
b'11223344'
>>> codecs.encode(a.value, 'hex_codec')
b'11223344'
>>> base64.b16encode(a.value)
b'11223344'
>>> bytes.fromhex(str(b'11223344', 'utf-8'))
b'\x11"3D'
>>> ''.join('{:02x}'.format(e) for e in a.value)
'11223344'
>>> bytes.fromhex('11223344')
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比较吧。

hrgccx 发表于 2014-05-21 21:16

解决了,大神好强悍啊!!!!
我再问一个问题呗 :em49:
libc =cdll.LoadLibarary("libc.so.6")
a = create_string_buffer(b'\x11\x22\x33\x44')
libc.printf("%s",a)为什么什么都打印不出来呢?a不相当于一个地址吗?                                    
回复 2# timespace


   

timespace 发表于 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*:>>> libc.printf(b'%s\n', b'hello')
hello
6
>>> libc.printf('%s\n', b'hello')
0以前写过的一篇文章,有ctypes的例子http://blog.chinaunix.net/uid-190176-id-4128692.html
其它细节还是看标准库文档。


   
页: [1]
查看完整版本: [问题]如何打印一个c_void_p所指向的内容