问题描述
我正在尝试使用ctypes包装以下c函数:
#define MAX_IMAGE_WIDTH 1024
#define MAX_IMAGE_HEIGHT 1024
UFE_STATUS ufe_res;
char szFileName[256];
unsigned char* pImage;
int nWidth;
int nHeight;
// Get file name from user,szFileName
// Allocate image buffer
pImage = (unsigned char*)malloc(MAX_IMAGE_WIDTH,MAX_IMAGE_HEIGHT);
ufe_res = UFE_LoadImageFromBMPFile(szFileName,pImage,&nWidth,&nHeight);
但是,我不知道如何使用像这样的ctypes在python中分配内存:
pImage = (unsigned char*)malloc(MAX_IMAGE_WIDTH,MAX_IMAGE_HEIGHT);
有人可以告诉我该怎么做吗?
解决方法
以下内容将分配一个char
数组。 c_char * N
创建大小为N的一维数组:
image = (c_char * (MAX_IMAGE_WIDTH * MAX_IMAGE_HEIGHT))()
请注意,括号很重要:
>>> import ctypes
>>> x=10
>>> y=20
>>> ctypes.c_char * x * y # 2D char[y][x] equivalent type
<class '__main__.c_char_Array_10_Array_20'> # note order of x and y above
>>> ctypes.c_char * (x * y) # 1D char[x*y] equivalent type
<class '__main__.c_char_Array_200'>
>>> (ctypes.c_char * (x*y))() # instance of char[x*y] array.
<__main__.c_char_Array_200 object at 0x0000014CBB9AF848>
>>> i = (ctypes.c_char * x * y)() # instance of 2D char[y][x] array.
>>> i[19] # first dimension is y
<__main__.c_char_Array_10 object at 0x0000014CBB9AF848>
>>> i[19][9] # 2nd dimension is x
b'\x00'
上面可以创建任何类型的数组。如果您需要c_char
或c_wchar
数组,则可以使用:
>>> ctypes.create_string_buffer(x * y)
<__main__.c_char_Array_200 object at 0x0000014CBB9AF9C8>
>>> ctypes.create_unicode_buffer(x * y)
<ctypes.c_wchar_Array_200 object at 0x0000014CBB9AF848>