如何从C++;DLL到Python? 我正在研究一个Python 3应用程序,它调用C++开发的DLL。DLL读取数据库记录并将记录缓冲区返回给Python应用程序。我遇到的问题是数据库记录可能包含x'00'(空)字符。出现这种情况时,返回给Python应用程序的记录缓冲区将被截断为空字符
我正在使用memcpy将记录缓冲区复制到Python返回区域。我认为memcpy复制了指定的字节数,而不考虑内容 <>我不是C++程序员,所以我很可能误解MeMcPy是如何工作的。 下面的代码片段是测试代码的示例,将演示我遇到的问题 这是DLL:如何从C++;DLL到Python? 我正在研究一个Python 3应用程序,它调用C++开发的DLL。DLL读取数据库记录并将记录缓冲区返回给Python应用程序。我遇到的问题是数据库记录可能包含x'00'(空)字符。出现这种情况时,返回给Python应用程序的记录缓冲区将被截断为空字符,python,c++,dll,memcpy,Python,C++,Dll,Memcpy,我正在使用memcpy将记录缓冲区复制到Python返回区域。我认为memcpy复制了指定的字节数,而不考虑内容 我不是C++程序员,所以我很可能误解MeMcPy是如何工作的。 下面的代码片段是测试代码的示例,将演示我遇到的问题 这是DLL: #include "pch.h" #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostre
#include "pch.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define LIBDLL extern "C" __declspec(dllexport)
LIBDLL int readData_VPRI2(char* buffer, unsigned long buffer_length )
{
char unsigned buf[20];
int unsigned buf_len;
FILE* stream;
errno_t err;
err = fopen_s(&stream, "D:\\testfile", "rb");
if (err != 0) return err;
fread(buf, buffer_length, 1, stream);
memcpy(buffer, buf, buffer_length);
return 0;
}
Python执行的输出是:
rc = 0
buffer = b'ABCD'
buffer length = 4
如图所示,返回的缓冲区在x'00'处被截断
我猜可能有一些简单的事情我忽略了或不明白。如能提供有关如何纠正此问题的任何指导,将不胜感激
提前感谢。
,原来C++代码是按设计工作的。我关于
memcpy
的问题不是问题所在。它正在按文件记录的方式工作
我发现Python实际上可能正在截断字符串。cytpes.c_char.value
返回原始问题中描述的截断字符串
但是如果使用cyptes.c_char.raw
则返回整个字符串(在我的示例中,buffer
)(例如,500字节),并用x'00'填充。因此print(buffer.raw)
返回:
b'AB\x00CDefg\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
因为我已经知道我希望返回的记录的长度,所以我可以简单地从buffer.raw
中对其进行切片
感谢您的回复。
sizeof(buffer)
不是缓冲区大小,而是指针的大小。结果真的在\x00
处截断了吗?如果测试字符串
是'AB\x00CDefg'
,该怎么办?谢谢@MikeCAT。我的坏消息是。。。我更改了上面的代码示例。将流更改为test\u string=bytes('AB\x00CDefg',encoding='utf-8')
将导致:rc=0 buffer=b'AB'buffer length=2
rc = 0
buffer = b'ABCD'
buffer length = 4