Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用ctypes在特定地址显示字符串_Python_Ctypes - Fatal编程技术网

Python 如何使用ctypes在特定地址显示字符串

Python 如何使用ctypes在特定地址显示字符串,python,ctypes,Python,Ctypes,我正在处理一个C dll,其中一个函数返回指向字符串的指针。我想打印这个指针的内容 目前我有: >>> str_p = dll.myfunction(42) >>> print str_p 1371678884 我尝试了repr(str_p),repr(str_p.value),但似乎str_p被视为一个整数 当然,打印str(stru p)也会打印1371678884使用: ctypes.string_位于(地址[,大小]) 此函数返回字符串 从内存地址开

我正在处理一个C dll,其中一个函数返回指向字符串的指针。我想打印这个指针的内容

目前我有:

>>> str_p = dll.myfunction(42)
>>> print str_p
1371678884
我尝试了
repr(str_p)
repr(str_p.value)
,但似乎
str_p
被视为一个整数

当然,
打印str(stru p)
也会打印
1371678884
使用:

ctypes.string_位于(地址[,大小])

此函数返回字符串 从内存地址开始。如果指定了大小,则使用它 作为大小,否则假定字符串以零结尾

使用:

ctypes.string_位于(地址[,大小])

此函数返回字符串 从内存地址开始。如果指定了大小,则使用它 作为大小,否则假定字符串以零结尾


将函数的
restype
设置为

因此,这将对您有效:

>>> dll.myfunction.restype = c_char_p
>>> str_p = dll.myfunction(42)
>>> print str_p
The Content Of Your String

将函数的
restype
设置为

因此,这将对您有效:

>>> dll.myfunction.restype = c_char_p
>>> str_p = dll.myfunction(42)
>>> print str_p
The Content Of Your String

print str(str_p)
如果将
str_p
视为一个整数,则将打印相同的字符串。因此,您将得到什么以及希望打印什么?函数将返回指向字符串的指针。我得到的不是指针而是地址(我想1371678884是一个地址)。问题是如何获取位于该地址的数据。如果您使用ctypes模块,您是否尝试过
ctypes.pointer(str\u p)
print str(str\u p)
将打印相同的数据,如果
str\u p
被视为整数。那么您得到了什么以及希望打印什么呢?函数将返回指向字符串的指针。我得到的不是指针而是地址(我想1371678884是一个地址)。问题是如何获取位于此地址的数据。如果您使用的是ctypes模块,您是否尝试过
ctypes.pointer(str\u p)
?不,这是绝对错误的。默认的重新类型是
c_int
,因此64位指针将被截断为32位。另一个答案是正确的。但是它工作得很好,它回答了我的问题:)@novox,没有将
restype
设置为指针类型,您的
stru p
变量是被截断为32位的地址。仅当字符串的地址恰好适合32位
int
或您恰好使用32位进程时,此选项才有效。它通常在64位进程中不起作用。您必须将
restype
设置为指针类型,例如
c\u char\p
。不,这是绝对错误的。默认的重新类型是
c_int
,因此64位指针将被截断为32位。另一个答案是正确的。但是它工作得很好,它回答了我的问题:)@novox,没有将
restype
设置为指针类型,您的
stru p
变量是被截断为32位的地址。仅当字符串的地址恰好适合32位
int
或您恰好使用32位进程时,此选项才有效。它通常在64位进程中不起作用。必须将
restype
设置为指针类型,例如
c\u char\p