如何在python中将包含十六进制值的无符号char*数组写入文件
How to write a unsigned char* array containing hex values to file in python
我有一个C dll,它以包含十六进制值的无符号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()函数的返回有问题。。感谢您的帮助。
假设您的getPluginManualAsPDF
和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()
'x01x02x03'
>>>
>>>
>>> getPluginManualNrOfBytes(None)
12345
>>>
相关文章:
- 将无符号char*转换为std::istream*C++
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 用 Q_DECLARE_METATYPE 声明无符号的 char[]
- 覆盖性静态分析说无符号的int是char(C++)
- 错误:AES 加密密钥:从"char*"到"无符号字符"的转换无效
- 为什么 fstream.read 和 fstream.write 使用 char 而不是无符号字符?
- 通过无符号 char 别名进行对象访问,加载和存储时会发生什么?
- 将数据从 vector<unsigned char> 传输到无符号 char[]
- 如何修复此 OpenCV 错误:断言失败((无符号)i < (无符号)cn) 在 cv::Vec<unsigned char,3>:::运算符 (), 文件
- 将 const std::vector<char> 转换为无符号字符*?
- 为什么basic_fstream<无符号字符>比 Windows 上的basic_fstream慢一个数量级<char>?
- 将 C++ 转换为 Python 通过引用返回无符号 char*
- "WORD":"char [20]"与"无符号短"的间接级别不同
- 我可以在不复制的情况下将 std::vector 重新解释<char>为 std::vector<无符号字符>吗?
- 使strncmp()接受无符号的char *作为论点
- C 将char []从网络转换为主机订单,并分配给无符号int
- Vizualize无符号char *数组作为位图
- C/C++:将 char[] 转换为 int 失败,无符号 char[] 到 int 有效,为什么
- 将无符号char*缓冲区分配给字符串
- C++ 错误:对 '(std::string {aka std::basic_string}) (<char>无符号整数、字符)的调用不匹配