Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在python中将包含十六进制值的无符号char*数组写入文件_C++_Python_C_Ctypes - Fatal编程技术网

C++ 如何在python中将包含十六进制值的无符号char*数组写入文件

C++ 如何在python中将包含十六进制值的无符号char*数组写入文件,c++,python,c,ctypes,C++,Python,C,Ctypes,我有一个C dll,它以包含十六进制值的无符号字符*的形式返回PDF文件。如何使用ctypes检索此数组并将其保存到“挖掘”PDF的文件中 例如,在C中,我这样做: unsigned char* manual = getPluginManualAsPDF(mPlugin); long nrOfBytes = getPluginManualNrOfBytes(mPlugin); string tempFile(mtk::JoinPath(getTempFolder(getRRHan

我有一个C dll,它以包含十六进制值的无符号字符*的形式返回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) ;
}

但在返回getPluginManualAsPDF()函数时遇到问题。。感谢您的帮助。

假设您的
GetPluginManualsPDF
getPluginManualNrOfBytes
具有以下原型:

/* 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
>>>
#gcc-Wall rrpLib.c-shared-o rrpLib.dll
#蟒蛇
>>>从ctypes导入*
>>>
>>>rrpLib=cdll.rrpLib#或windl(如果使用STDCALL)
>>>
>>>getPluginManualAsPDF=rrpLib.getPluginManualAsPDF
>>>getPluginManualAsPDF.restype=指针(c_ubyte)
>>>getPluginManualAsPDF.argtypes=[c\u void\u p]
>>>
>>>getPluginManualNrOfBytes=rrpLib.getPluginManualNrOfBytes
>>>getPluginManualNrOfBytes.restype=c_long
>>>getPluginManualNrOfBytes.argtypes=[c\u void\u p]
>>>
>>>getPluginManualAsPDF(无)[0]
1.
>>>getPluginManualAsPDF(无)[1]
2.
>>>getPluginManualAsPDF(无)[2]
3.
>>>
>>>
>>>ptr=getPluginManualAsPDF(无)
>>>手动=转换(ptr,指针(c_ubyte*3))[0]
>>>手册
>>>打开('out.txt','wb')。写入(bytearray(手动))
>>>打开('out.txt')。读取()
“\x01\x02\x03”
>>>
>>>
>>>GetPluginManualRofBytes(无)
12345
>>>

也可以把C++转换成那个标签列表,因为你知道,使用它和所有。所以,你必须调用两个函数,一个是获取数据指针,另一个是得到数据的长度。这很不寻常…这是C。getPluginManualAsPDF返回一个包含字节的无符号字符*。客户端需要知道数组中有多少字节,这就是第二个函数存在的原因。您应该将结果转换为数组,例如
manual=cast(ptr,POINTER(c_char*nrOfBytes))[0]
。这支持缓冲区协议,以有效地将库分配的缓冲区写入文件。它可以直接传递给
write
方法。太好了。我是根据你的建议弄明白的。关键是指针(c_ubyte),然后按照建议进行转换。然后我可以将“手册”保存为:open(outpname,'wb')作为输出:output.write(manual)(是的,pluginHandle是void*)
# 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
>>>