如何在 python 中创建等效结构并使用 malloc 更改空指针的引用
How to create equivalent struct in python and use malloc to change reference of null pointer
我正在使用 ctypes 'translating' 从 C++ 到 python 的代码。通常我不会坐下来将代码从 C++ 翻译成 Python,但我正在从事的项目需要它。
原始 C++ 代码有一个按以下方式格式化的结构;
typedef struct {
ViChar resourceString[256];
}BP2_DEVICE;
在主代码中,指针初始化如下;
BP2_DEVICE* resStr = 0;
然后分配内存;
resStr = (BP2_DEVICE *)malloc(256);
在网上搜索帮助时,我了解到创建一个 class 来表示 BP2_Device 结构是可行的;
class BP2_Device:
def __init__(self, resourceString):
self.resourceString = resourceString
不过,我不确定如何将 'resourceString' 需要是一个可变数组这一事实结合起来。我知道将 resourceString 变成可变数组的代码如下;
resourceString = ct.create_string_buffer(256)
至于如何让它与 struct/class 一起工作,我不知道。
我也查看了 this 问题以寻求有关 malloc 的帮助,但他们的设置与我的不完全相同。
整个代码很长,我不想用它来淹没问题。如果有什么我需要补充说明的,请告诉我。感谢您提供任何帮助,谢谢。
这取决于你想如何使用这个结构,但是如果 resourceString
是一个 null-terminated 字符串,这有效:
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'
我正在使用 ctypes 'translating' 从 C++ 到 python 的代码。通常我不会坐下来将代码从 C++ 翻译成 Python,但我正在从事的项目需要它。
原始 C++ 代码有一个按以下方式格式化的结构;
typedef struct {
ViChar resourceString[256];
}BP2_DEVICE;
在主代码中,指针初始化如下;
BP2_DEVICE* resStr = 0;
然后分配内存;
resStr = (BP2_DEVICE *)malloc(256);
在网上搜索帮助时,我了解到创建一个 class 来表示 BP2_Device 结构是可行的;
class BP2_Device:
def __init__(self, resourceString):
self.resourceString = resourceString
不过,我不确定如何将 'resourceString' 需要是一个可变数组这一事实结合起来。我知道将 resourceString 变成可变数组的代码如下;
resourceString = ct.create_string_buffer(256)
至于如何让它与 struct/class 一起工作,我不知道。
我也查看了 this 问题以寻求有关 malloc 的帮助,但他们的设置与我的不完全相同。
整个代码很长,我不想用它来淹没问题。如果有什么我需要补充说明的,请告诉我。感谢您提供任何帮助,谢谢。
这取决于你想如何使用这个结构,但是如果 resourceString
是一个 null-terminated 字符串,这有效:
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'