考慮下面的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如何直接操作內存以及如何實現我期望的目標?
謝謝。