我想从 go [][]byte 转换为 C **char。换句话说,我在 go 中有一个字节矩阵,我想将其转换为 C 中的 char 双指针。
请假设我必须有一个 [][]byte 作为输入和一个 **char 作为输出。
我知道可以通过执行以下操作从 []byte 转换为 *char:
((*C.char)(unsafe.Pointer(&data[0])))
但似乎不可能将这种情况扩展到第二维度。我尝试了一些非常复杂的方法,将一个 [][] 字节打包到一个新的 [] 字节中。然后,我将该 []byte 发送到一个 C 函数,该函数使用指针算术创建一个 **char 以指向正确位置的新 []byte。
不过,这种转换给了我奇怪的行为,我的数据在几次迭代中是正确的,但在函数调用之间似乎被损坏了。
如果有人有任何想法,我将非常感激。
从回复中我发现,声明我正在使用原始数据而不是字符串也很重要。因此,go 字节类型。因此,如果添加 C 字符串终止符,原始数据将被损坏。我只是使用 C **char,因为 char 的大小是一个字节。也就是说,感谢您的回复。我能够根据我的需要调整已接受的答案。
未经测试的骨架:
func foo(b [][]byte) {
outer := make([]*C.char, len(b)+1)
for i, inner := range b {
outer[i] = C.CString(string(inner))
}
C.bar(unsafe.Pointer(&outer[0])) // void bar(**char) {...}
}
编辑:完整示例(已测试):
package main
/*
#include <stdlib.h>
#include <stdio.h>
void bar(char **a) {
char *s ;
for (;(s = *a++);)
printf("\"%s\"\n", s);
}
*/
import "C"
import "unsafe"
func foo(b [][]byte) {
outer := make([]*C.char, len(b)+1)
for i, inner := range b {
outer[i] = C.CString(string(inner))
}
C.bar((**C.char)(unsafe.Pointer(&outer[0]))) // void bar(**char) {...}
}
func main() {
foo([][]byte{[]byte("Hello"), []byte("world")})
}
(15:24) jnml@fsc-r550:~/src/tmp/SO/14833531$ go run main.go
"Hello"
"world"
(15:25) jnml@fsc-r550:~/src/tmp/SO/14833531$
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)