Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.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++;DLL到Python? 我正在研究一个Python 3应用程序,它调用C++开发的DLL。DLL读取数据库记录并将记录缓冲区返回给Python应用程序。我遇到的问题是数据库记录可能包含x'00'(空)字符。出现这种情况时,返回给Python应用程序的记录缓冲区将被截断为空字符_Python_C++_Dll_Memcpy - Fatal编程技术网

如何从C++;DLL到Python? 我正在研究一个Python 3应用程序,它调用C++开发的DLL。DLL读取数据库记录并将记录缓冲区返回给Python应用程序。我遇到的问题是数据库记录可能包含x'00'(空)字符。出现这种情况时,返回给Python应用程序的记录缓冲区将被截断为空字符

如何从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

我正在使用memcpy将记录缓冲区复制到Python返回区域。我认为memcpy复制了指定的字节数,而不考虑内容

<>我不是C++程序员,所以我很可能误解MeMcPy是如何工作的。 下面的代码片段是测试代码的示例,将演示我遇到的问题

这是DLL:

#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