考虑下面的Python困惑使用CTYPE指针在Python
>>> from ctypes import *
>>> from ctypes.wintypes import *
>>> class _Filename(Structure):
... _fields_ = [("NameLengthInBytes", USHORT),
... ("Name", WCHAR * 1)]
...
>>> req = create_string_buffer(20)
>>> preq = cast(req, POINTER(_Filename))
>>> req
<ctypes.c_char_Array_20 object at 0x0000000002038DC8>
>>> preq.contents
<__main__._Filename object at 0x0000000002038EC8>
>>> preq.contents.NameLengthInBytes = 10
>>> memmove(preq.contents.Name, u"ABCDE", 10)
31932464L
>>> memoryview(req).tobytes()
'\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> preq.contents.Name=u"Z"
>>> memoryview(req).tobytes()
'\n\x00Z\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
我很困惑。我预计内容的地址preq与req相同。至少这是我认为铸会做。
我想要做的是创建一个连续的内存块,其中包含NameLengthInBytes后跟一个宽度为一个任意长度的字符串。我想编写代码,以便它取决于字段名称_Filename,以便如果_Filename的定义发生更改(例如通过在Name之前添加额外字段),代码仍会复制到正确的缓冲区位置。
任何人都可以帮助我理解Python和ctypes如何直接操作内存以及如何实现我期望的目标?
谢谢。