登录
首页 >  Golang >  Go问答

如何通过CGO从C函数中的内部void *返回字节?

来源:stackoverflow

时间:2024-04-21 08:39:36 124浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《如何通过CGO从C函数中的内部void *返回字节?》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

我使用以下定义包装一个 c 函数:

int parser_shift(parser* parser, void* buffer, int length);

它从未解析字节的内部缓冲区中删除最多 length 个字节,并将它们存储在给定的缓冲区中。

现在我希望将其包装到具有以下定义的 go 函数中:

func (p *parser) shift() []byte {
    var buffer []byte
    // todo:

    return buffer
}

用 cgo 完成上面的 todo 的正确书写方式是什么?

我尝试了以下方法,但它因错误而崩溃:“/path/to/my/program”中的错误:free():无效的下一个大小(快速):0x00007f8fe0000aa0:

var buffer []byte
bufStr := C.CString(string(buffer))
defer C.free(unsafe.Pointer(bufStr))
C.parser_shift(p.Cparser, unsafe.Pointer(bufStr), C.int(8192))
buffer = []byte(C.GoString(bufStr))
return buffer

解决方案


假设您的 parser_shift 函数返回实际存储在缓冲区中的字节数,您可以执行以下操作:

func (p *parser) shift() []byte {
    var buffer [8192]byte
    parsed := int(c.parser_shift(p.cparser, unsafe.pointer(&buffer[0]), c.int(len(buffer))))
    return buffer[:parsed]
}

不需要与字符串进行转换,只需将您想要写入的内存传递给它即可。

尝试这个函数

// C pointer, length to Go []byte
func C.GoBytes(unsafe.Pointer, C.int) []byte

理论要掌握,实操不能落!以上关于《如何通过CGO从C函数中的内部void *返回字节?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>