Python获取C++中返回的char*字段的两种思路

2025-04-10 15:50

本文主要是介绍Python获取C++中返回的char*字段的两种思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下...

有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

一、将char*放入结构体中

c++函数如下:

typedef struct FileData {
        long long lenth;
        char* data;
};
 
bool GetData(FileData *data)
{
    if (data == nullptr) {
        return false;
    }
    data->data = new char[255];
    memset(data->data, 0, 255);
    const char* laosi = "wdaweqweqweqweqweqweqweqwdvdggggsdfsferqwerawerqwerqwerqerqwedsd";
    memcpy(data->data, laosi, strlen(laosi));
    data->lenth = strlen(laosi);
    return true;
}

python代码如下:

import ctywww.chinasem.cnpes
import os
import platform
from threading import Thread,Lock
 
CharPtr = ctypes.POINTER(ctypes.c_char)
class FileData(ctypes.Structure):
    _fields_=[
        ("lenth",ctypes.c_longlong),
        ("data",CharPtr)
    ]
 
FileDataPtr = ctypes.POINTER(FileData)
 
def GetDll():
    if platform.system().lower() == 'Windows':
        isWinPlat_ = True
    else:
        isWinPlat_ = False
    currentPath_ = os.getcwd().replace('\\','/') 
    jsif isWinPlat_:
        dll_ = ctypes.CDLL(currentPath_ + '/PyTest.dll')
    elwww.chinasem.cnse:
        dll_ = ctypes.CDLL(currentPath_ + '/PyTest.so')
    return dll_
 
pytestdll_ = GetDll()
 
def GetData():
    getDataF = pytestdll_.GetData
    getDataF.argtypes=[FileDataPtr]
    getDataF.restype = ctypes.c_bool
 
    dataa = FileData()
    ret = getDataF(ctypes.byref(dataa))
    print(dataa.lenth)
    len = dataa.lenth
    for i in range(len):
        print(dataa.da编程ta[i])
 
    charArr = ctypes.c_char*dataa.lenth
    chawww.chinasem.cnr_arr = charArr(*dataa.data[:dataa.lenth])
    print(char_arr.raw)
 
    return ret
 
GetData()

二、将char*作为返回值

c++代码如下:

char* GetDatas(long long& lenth)
{
    char* data = new char[255];
    memset(data, 0, 255);
    const char* laosi = "wdaweqweqweqweqweqweqweqwdvdggggsdfsferqwerawerqwerqwerqerqwedsd";
    memcpy(data, laosi, strlen(laosi));
    lenth = strlen(laosi);
    return data;
}

python代码如下:

import ctypes
import os
import platform
from threading import Thread,Lock
 
CharPtr = ctypes.POINTER(ctypes.c_char)
class FileData(ctypes.Structure):
    _fields_=[
        ("lenth",ctypes.c_longlong),
        ("data",CharPtr)
    ]
 
FileDataPtr = ctypes.POINTER(FileData)
 
def GetDll():
    if platform.system().lower() == 'windows':
        isWinPlat_ = True
    else:
        isWinPlat_ = False
    currentPath_ = os.getcwd().replace('\\','/') 
    if isWinPlat_:
        dll_ = ctypes.CDLL(currentPath_ + '/PyTest.dll')
    else:
        dll_ = ctypes.CDLL(currentPath_ + '/PyTest.so')
    return dll_
 
pytestdll_ = GetDll()
 
def GetDataS():
    getDatasF = pytestdll_.GetDatas
    getDatasF.argtypes=[ctypes.POINTER(ctypes.c_longlong)]
    getDatasF.restype = ctypes.c_char_p
    lengths = ctypes.c_longlong(0)
    ret = getDatasF(ctypes.byref(lengths))
    print(lengths.value)
    print(ret)
GetDataS()

到此这篇关于Python获取C++中返回的char*字段的两种思路的文章就介绍到这了,更多相关Python获取C++返回char*字段内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Python获取C++中返回的char*字段的两种思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154169

相关文章

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数