如何将 IronPython ctypes c_char_p 指针设置为指向不是要读取的有效内存地址的绝对地址?
How do I set an IronPython ctypes c_char_p pointer to an absolute address that is not a valid memory address to read from?
在 IronPython 2.7.9 中我需要设置一个 c_char_p
到绝对地址 0xCAFEBABE
。这个 'address' 将 不是 是一个有效的内存地址来读取,但它作为一个神奇的词来触发某些东西(你可以阅读为什么我必须使用 char 的背景* 在“”我的问题中没有内容,其中原始问题不足以解决我的问题)。此外,我只能使用 32 位版本的 IronPython 解释器,因为我必须加载 32 位 DLL。
from ctypes import *
class MyStruct(Structure):
_fields_ = [("config", c_char_p),
("magicnumber", c_char_p)]
mystruct = MyStruct()
mystruct.config = "my RS232 configuration"
mystruct.magicnumber = cast(0xCAFEBABE, c_char_p)
不幸的是,最后一个作业引发了 OverflowError
。
其他 Python 实现(CPython 2.x、CPython 3.x、PyPy 和 ActivePython、...)可以毫无问题地完成这项工作。
属性magicnumber
的赋值应该做的是Python解释器将32位地址0xCAFEBABE
写入结构内部指针的正确内存地址(what除了 IronPython 之外,许多其他 Python 发行版都可以做到。
IronPython 与 .NET 框架的紧密耦合使得 IronPython 受到许多想要将其与其他 .NET 语言结合使用的开发人员的兴趣。
可能是 IronPython 无法完成此任务?
我很高兴至少有一个可靠的答案。
提前致谢!
要为所有 Python 实现获得此问题的整体解决方案,我们应该 不 将结构属性声明为其原始类型 c_char_p
但作为c_uint
.
这意味着将对此属性的访问包装到必须处理修改后的类型的处理函数。
使用字符串作为参数对此属性进行写访问必须分配适当的缓冲区并将字符串存储到缓冲区中。
然后把缓冲区的地址写入这个c_uint
属性。带有特殊标志 0xCAFEBABE
的写访问可以直接写入属性的新 c_uint
类型。
读取访问应该只 return 缓冲区的内容,因为通过此属性传输到 Python 代码的数据不适用于此属性。
这已经过验证并且可以完美运行。
在 IronPython 2.7.9 中我需要设置一个 c_char_p
到绝对地址 0xCAFEBABE
。这个 'address' 将 不是 是一个有效的内存地址来读取,但它作为一个神奇的词来触发某些东西(你可以阅读为什么我必须使用 char 的背景* 在“
from ctypes import *
class MyStruct(Structure):
_fields_ = [("config", c_char_p),
("magicnumber", c_char_p)]
mystruct = MyStruct()
mystruct.config = "my RS232 configuration"
mystruct.magicnumber = cast(0xCAFEBABE, c_char_p)
不幸的是,最后一个作业引发了 OverflowError
。
其他 Python 实现(CPython 2.x、CPython 3.x、PyPy 和 ActivePython、...)可以毫无问题地完成这项工作。
属性magicnumber
的赋值应该做的是Python解释器将32位地址0xCAFEBABE
写入结构内部指针的正确内存地址(what除了 IronPython 之外,许多其他 Python 发行版都可以做到。
IronPython 与 .NET 框架的紧密耦合使得 IronPython 受到许多想要将其与其他 .NET 语言结合使用的开发人员的兴趣。
可能是 IronPython 无法完成此任务? 我很高兴至少有一个可靠的答案。 提前致谢!
要为所有 Python 实现获得此问题的整体解决方案,我们应该 不 将结构属性声明为其原始类型 c_char_p
但作为c_uint
.
这意味着将对此属性的访问包装到必须处理修改后的类型的处理函数。
使用字符串作为参数对此属性进行写访问必须分配适当的缓冲区并将字符串存储到缓冲区中。
然后把缓冲区的地址写入这个c_uint
属性。带有特殊标志 0xCAFEBABE
的写访问可以直接写入属性的新 c_uint
类型。
读取访问应该只 return 缓冲区的内容,因为通过此属性传输到 Python 代码的数据不适用于此属性。
这已经过验证并且可以完美运行。