英文:
passing a byte array from go to cgo
问题
我有以下的C代码:
uint32_t cHash32(const char *s, size_t len) { return util::Hash32(s, len); }
我正在一个Go项目中这样调用它:
func Hash32(s []byte) uint32 {
return uint32(C.cHash32((*C.char)(unsafe.Pointer(&s[0])), C.size_t(len(s))))
}
不知何故,结果出错了。
当传入"hi"时,根据同一库的Python绑定(Google的farmhash),预期结果应该是4063302914。
我猜想假设s可以转换为*C.char有点天真,不是吗!
我该如何将s的内容作为*C.char传递?
英文:
I have the following C code
uint32_t cHash32(const char *s, size_t len) { return util::Hash32(s, len); }
I am calling it from a go project as follows
func Hash32(s []byte) uint32 {
return uint32(C.cHash32((*C.char)(unsafe.Pointer(&s)), C.size_t(len(s))))
}
Somehow the result is broken.
When passing "hi" the expected result should be 4063302914 according to the python bindings to the same library (farmhash by google).
I guess that assuming s can be translated to a *C.char is a bit naive isn't it!
How do I pass the content of s as a *C.char?
答案1
得分: 3
是的,你可以通过在Go语言中使用C.CString
来创建*C.char。在Google Playground上不允许使用cgo,所以你需要下载这个链接并在本地运行它才能使用。
http://play.golang.org/p/inthA1i0C2
将字节切片转换为字符串,然后再转换为*char C.CString(string([]byte("bytes")))
。
英文:
Yes, you can create *C.char in Go via C.CString
. cgo is not allowed on google playground, so you will need to download this link and run it locally to use it.
http://play.golang.org/p/inthA1i0C2
Convert the byte slice to a string, then to *char C.CString(string([]byte("bytes")))
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论