为了账号安全,请及时绑定邮箱和手机立即绑定

难以传递和访问从 C 到 Go 的指针

难以传递和访问从 C 到 Go 的指针

Go
大话西游666 2022-08-24 10:57:28
我有一个用C编写的串行库,它有一个rx回调。我们访问在此回调函数中通过串行链路接收的字节。我想将收到的字节传递给用Go编写的应用程序层。为此,我已经能够从 C Rx 回调调用 go 函数。但是,当我尝试将指向rx字节的指针传递给Go函数时,我没有得到我所期望的。我编写了一个示例程序,其中 C 函数返回指向 Go 函数的指针。我期望:将被打印出来hello实际结果:%!s(*uint8=0xc000018072)这里有一个测试程序来说明我正在尝试做的事情:package main//#include <stdint.h>// extern void goHandler(uint8_t *str);//// static void doPrint(uint8_t *str) {//     goHandler(str);// }import "C"import "fmt"//export goHandlerfunc goHandler(str *uint8)  {        fmt.Printf("%s\n",str)}func main()  {   bytes := []uint8("hello")   C.doPrint((*C.uchar)(&bytes[0]))}编辑:我学习了如何执行指针算术来访问与指针地址偏移的数据,但是有没有办法将整个数据从偏移量0传递到特定的偏移量(而不是逐个?)
查看完整描述

1 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

我试过这个,它的工作原理,可能比任何其他方法都好:


package main

//#include <stdint.h>

// extern void goHandler(uint8_t *str, uint8_t length);

//

// static void doPrint(uint8_t *str, uint8_t length) {

//     goHandler(str, length);

// }

import "C"

import "fmt"

import "unsafe"


//export goHandler

func goHandler(str *uint8, length uint8)  {

        b := *(*[1<<20]byte)(unsafe.Pointer(str))

        fmt.Printf("%s\n",b[0:length])

}


func main()  {

   bytes := []uint8("hello")

   C.doPrint((*C.uchar)(&bytes[0]), C.uchar(len(bytes)))

}


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信