在ctypes中转换bytearray实例

时间:2014-08-02 14:13:57

标签: python ctypes

在pycharm中进行开发时,下面的代码有时会失败(转换结构的内容会发生变化),当我运行coverage单元测试时,而不是当它作为单元测试运行时。以下是代码的相关部分:

class SomeStruct(ctypes.Structure):
    _fields_ = [
        ('field', ctypes.c_char)
    ]

res = bytearray(b'12345')
ctypes.cast(bytes(res), ctypes.POINTER(SomeStruct)).contents

但是以下内容始终有效:

class SomeStruct(ctypes.Structure):
    _fields_ = [
        ('field', ctypes.c_char)
    ]

res = bytearray(b'12345')
res_bytes = bytes(res)
ctypes.cast(res_bytes, ctypes.POINTER(SomeStruct)).contents

在我看来,这似乎是一些引用计数问题,但我不确定。为什么会出现这个问题?在ctypes中转换bytearray实例的正确方法是什么?

python版本是3.4.0,x64。

1 个答案:

答案 0 :(得分:3)

以下答案有助于: Python ctypes structure being overwritten when allocating more memory

class SomeStruct(ctypes.Structure):
    _fields_ = [
        ('field', ctypes.c_char)
    ]

res = bytearray(b'12345')
ctypes.cast(ctypes.create_string_buffer(bytes(res)), ctypes.POINTER(SomeStruct)).contents