如何在python中创建等价结构并使用malloc更改空点的引用

2024-10-01 22:40:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我是用cType从C++到python的代码翻译。通常我不会坐在代码中从C++到Python,但是我正在处理的项目需要它。你知道吗

原始C++代码的结构形式如下:

typedef struct {
        ViChar resourceString[256];
    }BP2_DEVICE;

在主代码中,指针初始化如下:

BP2_DEVICE* resStr = 0;

然后分配内存

resStr = (BP2_DEVICE *)malloc(256);

在网上搜索帮助时,我读到创建一个类来表示BP2\u设备结构是可行的

class BP2_Device:
    def __init__(self, resourceString):
        self.resourceString = resourceString

不过,我不确定如何合并“resourceString”必须是可变数组这一事实。我知道将resourceString生成可变数组的代码如下:

resourceString = ct.create_string_buffer(256)

至于如何使它与结构/类一起工作,我不知道。你知道吗

我还研究了this问题以获得malloc的帮助,但是他们的设置和我的不完全一样。你知道吗

整个代码是相当长的,我不想压倒它的问题。如果有什么我需要补充澄清的,请告诉我。谢谢你的帮助。你知道吗


Tags: 项目代码selfdevice数组ctype结构struct
1条回答
网友
1楼 · 发布于 2024-10-01 22:40:57

这取决于您希望如何使用该结构,但如果resourceString是以null结尾的字符串,则可以这样做:

from ctypes import *

class Bp2Device(Structure):
    _fields_ = [('resourceString',c_char * 256)]

dev = Bp2Device(b'some resource string')
print(dev.resourceString)
dev.resourceString = b'x' * 256 #works
dev.resourceString = b'x' * 257 #fails

输出:

b'some resource string'
Traceback (most recent call last):
  File "C:\test.py", line 9, in <module>
    dev.resourceString = b'x' * 257
ValueError: bytes too long (257, maximum length 256)

请注意,resourceString是一个可写缓冲区,因此您可以将此结构传递给C DLL函数,它们可以安全地对其进行写入。ctypes专门处理c_char * n数组,并将它们显示为bytes,但由于这种特殊处理,您不能单独为数组的元素赋值。如果需要可写元素,可以使用c_ubyte * 256,但是不能直接用字节字符串初始化数组。示例:

from ctypes import *

BYTEARRAY256 = c_ubyte*256

class Bp2Device(Structure):
    _fields_ = [('resourceString',BYTEARRAY256)]

b = BYTEARRAY256(*list(b'abcdefg'))
dev = Bp2Device(b)
dev.resourceString[6] = ord('x')
print(bytes(dev.resourceString))

输出:

b'abcdefx\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

相关问题 更多 >

    热门问题