gpt4 book ai didi

c++ - 如何将包含十六进制值的 unsigned char* 数组写入 python 文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:27 25 4
gpt4 key购买 nike

我有一个 C dll,它以包含十六进制值的 unsigned char* 形式返回 PDF 文件。我如何使用 ctypes 检索此数组并将其保存到“挖掘”PDF 的文件中?

例如在 C 中我这样做:

unsigned char* manual = getPluginManualAsPDF(mPlugin);
long nrOfBytes = getPluginManualNrOfBytes(mPlugin);

string tempFile(mtk::JoinPath(getTempFolder(getRRHandleFromPlugin(mPlugin)), "AddNoisePluginDoc.pdf"));
ofstream temp(tempFile.c_str(), std::ios::binary);

long byteNr = 0;
while (byteNr < nrOfBytes)
{
temp<< manual[byteNr];
byteNr++;
}

temp.close();

//Spanw an external pdf reader
ShellExecute(Handle, "open", tempFile.c_str(), NULL, NULL,SW_SHOWNORMAL) ;
}

我正在尝试通过 CTypes 访问相同的函数(getPluginManualAsPDF 和 getPluginManualNrOfBytes),即

rrpLib.getPluginManualAsPDF.restype = c_buffer
def getPluginManualAsPDF(pluginHandle):
return rrpLib.getPluginManualAsPDF(pluginHandle)

def getPluginManualNrOfBytes(pluginHandle):
return rrpLib.getPluginManualNrOfBytes(pluginHandle)

但是 getPluginManualAsPDF() 函数的返回有问题。感谢任何帮助。

最佳答案

假设您的 getPluginManualAsPDFgetPluginManualNrOfBytes 具有以下原型(prototype):

/* FIXME: the type of `mPlugin` isn't clear, is it void * ? */

unsigned char * getPluginManualAsPDF(void *mPlugin) {
static unsigned char manual[] = {1, 2, 3};
return manual;
}

long getPluginManualNrOfBytes(void *mPlugin) {
return 12345;
}

您可以使用以下方式调用这两个函数:

from ctypes import *

rrpLib = cdll.rrpLib # or windll if it use STDCALL

getPluginManualAsPDF = rrpLib.getPluginManualAsPDF
getPluginManualAsPDF.restype = POINTER(c_ubyte)
getPluginManualAsPDF.argtypes = [c_void_p]

getPluginManualNrOfBytes = rrpLib.getPluginManualNrOfBytes
getPluginManualNrOfBytes.restype = c_long
getPluginManualNrOfBytes.argtypes = [c_void_p]

例如:

# gcc -Wall rrpLib.c -shared -o rrpLib.dll
# python
>>> from ctypes import *
>>>
>>> rrpLib = cdll.rrpLib # or windll if it uses STDCALL
>>>
>>> getPluginManualAsPDF = rrpLib.getPluginManualAsPDF
>>> getPluginManualAsPDF.restype = POINTER(c_ubyte)
>>> getPluginManualAsPDF.argtypes = [c_void_p]
>>>
>>> getPluginManualNrOfBytes = rrpLib.getPluginManualNrOfBytes
>>> getPluginManualNrOfBytes.restype = c_long
>>> getPluginManualNrOfBytes.argtypes = [c_void_p]
>>>
>>> getPluginManualAsPDF(None)[0]
1
>>> getPluginManualAsPDF(None)[1]
2
>>> getPluginManualAsPDF(None)[2]
3
>>>
>>>
>>> ptr = getPluginManualAsPDF(None)
>>> manual = cast(ptr, POINTER(c_ubyte * 3))[0]
>>> manual
<__main__.c_ubyte_Array_3 object at 0x017801C0>
>>> open('out.txt', 'wb').write(bytearray(manual))
>>> open('out.txt').read()
'\x01\x02\x03'
>>>
>>>
>>> getPluginManualNrOfBytes(None)
12345
>>>

关于c++ - 如何将包含十六进制值的 unsigned char* 数组写入 python 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20055459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com