iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >CGO项目中常用的数据转换怎么使用
  • 584
分享到

CGO项目中常用的数据转换怎么使用

2023-06-28 02:06:17 584人浏览 泡泡鱼
摘要

这篇文章主要讲解了“CGo项目中常用的数据转换怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CGO项目中常用的数据转换怎么使用”吧!       &nb

这篇文章主要讲解了“CGo项目中常用的数据转换怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CGO项目中常用的数据转换怎么使用”吧!

                           

前言

需要部署好相关环境和具备基本的知识点,这并非是一篇科普的文章,主要是针对实际项目中用到的类型转换和使用,针对动态库的函数调用参数传递和接收
1、GO环境,启动支持CGO
2、事先安装g++
3、看得懂GO和C的语法
4、最好会基本的makefile或者shell语法(表示我不懂,是个菜鸡,只会看个大概)主要是自己调试C需要用到

基本数据类型一览

CGO项目中常用的数据转换怎么使用

由于GO支持 C语言的调用,所以只列出了和C的转换,至于c++,需要转换成C语言才可以成功调用。需要注意的是:每个C的变量都是限定在一个包内使用的,如果想跨包使用,请用GO封装一层,否则会提示调用错误,找不到这个C变量。

项目中用到的数据类型转换

go的string转换成C

C的字符串就是一个字符数组的特例,简单的说就是一个字符数组以0结尾的数组就是字符串,所以不属于基本数据类型 。
C.CString是调用C的标准库,申请了新的内存空间,需要调用C.free释放,否则会内存泄漏。

    var  deviceIp string    cdeviceIp := C.CString(deviceIp)    defer C.free(unsafe.Pointer(cdeviceIp))
C的char * /char[] 转换成go的string

调用C的标准库 C.GoString,这个函数不会产生新的内存空间,创建的是一个副本,也不会释放内存空间。

C的字节数组转Go的string

比方说C的类型是:BYTE sSerialNumber[SERIALNO_LEN];
获取的方式就是利用append添加字节到字符串

    serialNo := make([]byte, 0)    for _, v := range sSerialNumber {        if v != 0 {            serialNo = append(serialNo, byte(v))        }    }

注意前面提到的字符数组和字符串的区别。

Go的string转C的字符数组

类型:CHAR szKeyFilePath[PU_CERT_FILE_PATH_MAX];

    var keyFilePath = "/home/Docker/path/file.jpg"    for i, b := range keyFilePath {        szKeyFilePath[i] = C.CHAR(b)    }
联合体的数据获取

接华为摄像头的数据回调的时候有联合体类型数据的获取,当作普通结构体获取的时候编译会一直提示找不到这个结构体,后面不得已,在C代码里面获取到联合体的数据之后,转换成基本数据类型,再重新Go调用。贴一个代码片断,人脸识别回调获取的数据。不用纠结前后文,看数据类型的获取就好。

void CGopfFaceSnapCallBack(CHAR *szBuffer, LONG lSize, void *pUsrData) {    PU_META_DATA *pstMetaData = 0;    int ret = Wrapper_IVS_User_GetMetaData(szBuffer, lSize, TARGET, &pstMetaData);    if (ret == PU_FALSE ){        return ;    }    PU_UserData *pstMetaUserData = pstMetaData->pstMetaUserData;    char  name[100]={0};    char  cardID[100]={0};    for(UINT uIndex = 0; uIndex < pstMetaData->usValidNumber; ++uIndex){       //printf("pstMetaData eType : %x\n", pstMetaUserData[uIndex].eType);        if (pstMetaUserData[uIndex].eType == FACE_INFO){            strcpy(cardID, pstMetaUserData[uIndex].unMetaData.stFaceInfo.cardID);            strcpy(name, pstMetaUserData[uIndex].unMetaData.stFaceInfo.name);            printf("GopfFaceSnapCallBack unMetaData.stFaceInfo cardID : %s\n", pstMetaUserData[uIndex].unMetaData.stFaceInfo.cardID);            printf("GopfFaceSnapCallBack unMetaData.stFaceInfo name : %s\n", pstMetaUserData[uIndex].unMetaData.stFaceInfo.name);            GopfFaceSnapCallBack(pstMetaUserData[uIndex].unMetaData.stFaceInfo.cardID,pUsrData);            break ;        }    }    Wrapper_IVS_User_FreeMetaData(&pstMetaData);    return ;}

如果这段代码换成Go的逻辑,直接在Go里面去读取的话会提示unMetaData 找不到定义。有其他成功读取方式的,还请告知。

C的回调函数的调用

先Go代码实现数据类型一致的函数,利用//export 导出为C函数,如果发现回调没进来,首先检查一下数据类型是否正确,再检查触发条件是否满足。这一步是为了在Go语言里面接收到C语言的回调数据,也就是回调后的数据是在这个函数里面获取。
2、CGO调用C函数,有同事说这一步可以不用,直接在Go里面调用第一步的函数就可以,我还没试过,公司祖传的代码就是这么写的,也就直接照用了。
3、在GO语言里面当作常用函数直接调用就好。
看代码示例:
C的函数声明:

typedef VOID (CALLBACK *pfRealDataCallBack)(CHAR *szBuffer, LONG lSize, VOID *pUsrData);

第一步的代码:

//export GopfRealDataCallBackfunc GopfRealDataCallBack(szBuffer *C.CHAR, lSize C.LONG, pUsrData unsafe.Pointer) {    fmt.Println(szBuffer,lSize,pUsrData)}
extern void GopfRealDataCallBack(CHAR *szBuffer, LONG lSize, void *pUsrData);void CGopfRealDataCallBack(CHAR *szBuffer, LONG lSize, void *pUsrData){    return GopfRealDataCallBack(szBuffer,lSize,pUsrData);}

C.pfRealDataCallBack(C.CGopfRealDataCallBack),需要在import C 上声明,否则调用不生效

void*和unsafe.Pointer

unsafe.Pointer号称是所有数据类型的转接桥梁,在语言层面两个可以认为等同的,当碰到void*可以用unsafe.Pointer来接收或者传递,具体类型的转换,需要根据实际类型做强转。比方说:

lpOutBuff := unsafe.Pointer(C.malloc(1024))

这个1024看实际情况修改,不是万能的。

结构体数组的传递
results := (*C.struct_name)(C.malloc(C.size_t(C.sizeof_struct_name * C.int(resLen))))    defer C.free(unsafe.Pointer(results))

struct_name换成具体的结构体名称,申请了空间要释放,GO检测不到C的部分。

结构体数组遍历获取元素数据
    for i := 0; i < int(resLen); i++ {        result := (*C.struct_name)(unsafe.Pointer(uintptr(unsafe.Pointer(results)) + uintptr(i*C.sizeof_struct_name)))    }

struct_name换成具体的结构体名称,uintptr是元素内存地址,根据偏移量获取元素。go    for i := 0; i < int(resLen); i++ {        result := (*C.DetectFaceResult)(unsafe.Pointer(uintptr(unsafe.Pointer(results)) + uintptr(i*C.sizeof_DetectFaceResult)))    }                                                  

感谢各位的阅读,以上就是“CGO项目中常用的数据转换怎么使用”的内容了,经过本文的学习后,相信大家对CGO项目中常用的数据转换怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: CGO项目中常用的数据转换怎么使用

本文链接: https://www.lsjlt.com/news/315475.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • CGO项目中常用的数据转换怎么使用
    这篇文章主要讲解了“CGO项目中常用的数据转换怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CGO项目中常用的数据转换怎么使用”吧!       &nb...
    99+
    2023-06-28
  • EChartstransform数据转换和dataZoom在项目中使用
    目录transform 进行数据转换dataZoomtransform 进行数据转换 数据转换是这样一个公式:outData=f(inputData)。F是转换方法,例如filte...
    99+
    2022-12-23
    ECharts transform数据转换 ECharts dataZoom
  • vue项目中怎么使用pinyin转换插件
    今天小编给大家分享一下vue项目中怎么使用pinyin转换插件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。使用pinyin...
    99+
    2023-06-29
  • vue项目中使用pinyin转换插件方式
    目录使用pinyin转换插件vue实现汉字转拼音1.建文件 const.js  2.vue-py.js文件3.项目中使用使用pinyin转换插件 npm install j...
    99+
    2024-04-02
  • java项目中怎么将数据结构转换为单链表
    java项目中怎么将数据结构转换为单链表?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。   单链表实现链表的打印及元素删除操作,链表的实现主要是next...
    99+
    2023-05-31
    java 数据结构 单链表
  • vue项目中怎么使用mock数据接口
    本篇文章为大家展示了vue项目中怎么使用mock数据接口,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.使用devServer.before进行数据mock//通...
    99+
    2024-04-02
  • 如何使用Visual Studio项目转换功能
    这篇文章将为大家详细讲解有关如何使用Visual Studio项目转换功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前一个版本使用VS2003开发,现在已经不能满足我们的需求,我们决定在新版本中升级到...
    99+
    2023-06-17
  • 探索Golang中常用的数据类型转换方法
    探索Golang中常用的数据类型转换方法前言在Golang编程中,经常会遇到不同数据类型之间的转换问题。本文将介绍一些常用的数据类型转换方法,并附上具体的代码示例,以供大家参考。字符串与整数之间的转换在Golang中,字符串与整数之间的转换...
    99+
    2023-12-23
    数据类型 Golang 转换方法
  • golang 函数类型转换和反射在大型项目中的有效使用
    类型转换和反射在大型 go 项目中至关重要,允许处理多种数据类型和系统交互。类型转换:允许将一种类型的值转换为另一种类型,使用 type assertion 或 type convers...
    99+
    2024-05-03
    golang 反射 类型转换
  • 怎么使用Vue.js将数据转换为字节
    这篇“怎么使用Vue.js将数据转换为字节”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用Vue.js将数据转换为字节...
    99+
    2023-07-06
  • Vue项目中的keepAlive怎么使用
    这篇“Vue项目中的keepAlive怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue项目中的keepAlive...
    99+
    2023-06-30
  • Vue3项目中的hooks怎么使用
    本篇内容介绍了“Vue3项目中的hooks怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!hooks 特点vue3 中的 hooks ...
    99+
    2023-07-06
  • 怎么在ssm项目中使用redis缓存查询数据
    怎么在ssm项目中使用redis缓存查询数据?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。xml配置:<bean id=&qu...
    99+
    2024-04-02
  • PHP中常用的数值转换函数介绍
    PHP是一门广泛应用于网站开发的脚本语言,它提供了许多强大的数值转换函数,能帮助开发者快速实现数据处理和转换操作。在本文中,我们将介绍PHP中常用的数值转换函数,并提供具体的代码示例。...
    99+
    2024-04-02
  • date()函数怎么在PHP项目中使用
    今天就跟大家聊聊有关date()函数怎么在PHP项目中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。语法:string date ( string&...
    99+
    2023-06-14
  • Java项目中有哪些常用的数据库连接池
    Java项目中有哪些常用的数据库连接池?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。定义数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出...
    99+
    2023-05-31
    java 数据库连接池 中有
  • loc函数怎么在Python项目中使用
    今天就跟大家聊聊有关loc函数怎么在Python项目中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学...
    99+
    2023-06-06
  • 在Xamarin.Android项目中如何使用数据库
    这篇文章将为大家详细讲解有关在Xamarin.Android项目中如何使用数据库,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在Xamarin.Android项目中使用预设数据库的具体操作步骤如下:(1)...
    99+
    2023-06-05
  • MySQL中的字符集转换函数怎么使用
    MySQL中的字符集转换函数可以通过使用CONVERT()函数来实现。该函数的语法如下: CONVERT(expr USING tr...
    99+
    2024-04-09
    mysql
  • PHP中的大小写转换函数怎么使用
    今天小编给大家分享一下PHP中的大小写转换函数怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。PHP中的大小写转换函数...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作