Python獲取C++中返回的char*字段的兩種思路
有時(shí)候需要獲取C++函數(shù)中返回來(lái)的不定長(zhǎng)的char*字符串,目前我找到兩種解決問(wèn)題的思路,具體實(shí)現(xiàn)如下:
一、將char*放入結(jié)構(gòu)體中
c++函數(shù)如下:
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 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 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.data[i])
charArr = ctypes.c_char*dataa.lenth
char_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()到此這篇關(guān)于Python獲取C++中返回的char*字段的兩種思路的文章就介紹到這了,更多相關(guān)Python獲取C++返回char*字段內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用虛擬環(huán)境(安裝下載更新卸載)命令
這篇文章主要為大家介紹了Python使用虛擬環(huán)境(安裝下載更新卸載)命令,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Github?Copilot結(jié)合python的使用方法詳解
最近也是聽(tīng)說(shuō)github出了一種最新的插件叫做copilot,于是申請(qǐng)了,下面這篇文章主要給大家介紹了關(guān)于Github?Copilot結(jié)合python使用的相關(guān)資料,需要的朋友可以參考下2022-04-04
解決selenium模塊利用performance獲取network日志請(qǐng)求報(bào)錯(cuò)的問(wèn)題(親測(cè)有效)
這篇文章主要介紹了解決selenium模塊利用performance獲取network日志請(qǐng)求報(bào)錯(cuò)的問(wèn)題(親測(cè)有效),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
從零學(xué)Python之入門(mén)(二)基本數(shù)據(jù)類型
這是繼“hello world”之后的第二篇入門(mén)級(jí)基礎(chǔ)知識(shí),以后這個(gè)系列會(huì)按照入門(mén)、進(jìn)階、精通三個(gè)分類進(jìn)行下去,歡迎高手們來(lái)拍磚2014-05-05
Python利用字符串編碼進(jìn)行簡(jiǎn)單加解密的代碼詳解
在 Python 編程領(lǐng)域中,字符串作為最基礎(chǔ)且高頻使用的數(shù)據(jù)類型,其特性與操作方法貫穿于程序開(kāi)發(fā)的各個(gè)環(huán)節(jié),本文詳細(xì)介紹了Python利用字符串編碼進(jìn)行簡(jiǎn)單加解密的方法,需要的朋友可以參考下2025-09-09
Python中動(dòng)態(tài)獲取對(duì)象的屬性和方法的教程
本文主要介紹了如何在Python中動(dòng)態(tài)獲取對(duì)象的屬性和方法,并運(yùn)行使用它們,需要的朋友可以參考一下2015-04-04
Python制作動(dòng)態(tài)詞頻條形圖的全過(guò)程
說(shuō)起動(dòng)態(tài)圖表,最火的莫過(guò)于動(dòng)態(tài)條形圖了,下面這篇文章主要給大家介紹了關(guān)于Python制作動(dòng)態(tài)詞頻條形圖的全過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-11-11

