当前位置: > > > > 如何通过CGO从C函数中的内部void *返回字节?
来源:stackoverflow
2024-04-21 08:39:36
0浏览
收藏
偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《如何通过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 *返回字节?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注公众号吧!