我正在使用ctypes将代码从C ++转换为python。通常,我不会坐下来将代码从C ++转换为Python,但是我正在研究的项目需要它。
原始的C ++代码具有以以下方式格式化的结构;
typedef struct {
ViChar resourceString[256];
}BP2_DEVICE;
在主代码中,指针的初始化如下;
BP2_DEVICE* resStr = 0;
然后分配内存;
resStr = (BP2_DEVICE *)malloc(256);
在网上寻求帮助时,我读到可以创建一个代表BP2_Device结构的类;
class BP2_Device:
def __init__(self, resourceString):
self.resourceString = resourceString
但是,我不确定如何将'resourceString'设为可变数组这一事实。我知道将resourceString变成可变数组的代码如下;
resourceString = ct.create_string_buffer(256)
关于如何使其与struct / class一起使用,我不知道。
我也查看了this问题,以寻求有关malloc的帮助,但是它们的设置并不完全像我的。
整个代码很长,我不想用它淹没这个问题。如果需要补充说明,请告诉我。谢谢您的帮助。
答案 0 :(得分:1)
这取决于您要如何使用该结构,但是如果resourceString
是一个以空值结尾的字符串,则可以这样做:
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'