猿问

如何在go中将[] [] byte转换为** char

我想将go [] []字节转换为C ** char。换句话说,我有一个字节矩阵,我想在C中将其转换为char双指针。

请假设我必须将[] []字节作为输入,并将** char作为输出。

我知道可以通过执行以下操作将[] byte转换为* char:

((*C.char)(unsafe.Pointer(&data[0])))

但似乎不可能将这种情况扩展到第二维。我尝试了一些非常精细的操作,在其中将[] []字节打包到一个新的[] byte中。然后,我将该[]字节发送到C函数,该函数使用指针算术在正确的位置指向新的[]字节,从而创建一个** char。

但是,这种转换给我带来了奇怪的行为,即我的数据经过几次迭代是正确的,但在两次函数调用之间似乎被破坏了。

如果有人有任何想法,我将不胜感激。

从响应中我看到,声明我正在使用原始数据而不是字符串也很重要。因此,go字节类型。因此,如果添加C字符串终止符,原始数据将被破坏。我只是使用C ** char,因为char的大小为一个字节。也就是说,感谢您的答复。我能够根据自己的需要调整接受的答案。


交互式爱情
浏览 693回答 2
2回答

慕斯王

这必须手动完成。您必须分配一个新的**C.char类型并遍历[][]byte切片中的每个元素,以将其分配给新列表。这涉及将**C.char指针偏移每次迭代的正确大小。这是一个执行此操作的示例程序。正如下面的评论所建议的,如果您打算char *使用类似printfC 中的内容打印列表,请确保输入字符串以 NULL 结尾。理想情况下,通过使用C.CString()函数进行转换。但这假定它们将被视为字符串。否则,您可能还需要提供一种将每个单独char *列表的长度传递给C函数的方法。package main/*#include <stdlib.h>#include <stdio.h>void test(char **list, size_t len){&nbsp; &nbsp; size_t i;&nbsp; &nbsp; for (i = 0; i < len; i++) {&nbsp; &nbsp; &nbsp; &nbsp; //printf("%ld: %s\n", i, list[i]);&nbsp; &nbsp; }}*/import "C"import "unsafe"func main() {&nbsp; &nbsp; list := [][]byte{&nbsp; &nbsp; &nbsp; &nbsp; []byte("foo"),&nbsp; &nbsp; &nbsp; &nbsp; []byte("bar"),&nbsp; &nbsp; &nbsp; &nbsp; []byte("baz"),&nbsp; &nbsp; }&nbsp; &nbsp; test(list)}func test(list [][]byte) {&nbsp; &nbsp; // Determine the size of a pointer on the current system.&nbsp; &nbsp; var b *C.char&nbsp; &nbsp; ptrSize := unsafe.Sizeof(b)&nbsp; &nbsp; // Allocate the char** list.&nbsp; &nbsp; ptr := C.malloc(C.size_t(len(list)) * C.size_t(ptrSize))&nbsp; &nbsp; defer C.free(ptr)&nbsp; &nbsp; // Assign each byte slice to its appropriate offset.&nbsp; &nbsp; for i := 0; i < len(list); i++ {&nbsp; &nbsp; &nbsp; &nbsp; element := (**C.char)(unsafe.Pointer(uintptr(ptr) + uintptr(i)*ptrSize))&nbsp; &nbsp; &nbsp; &nbsp; *element = (*C.char)(unsafe.Pointer(&list[i][0]))&nbsp; &nbsp; }&nbsp; &nbsp; // Call our C function.&nbsp; &nbsp; C.test((**C.char)(ptr), C.size_t(len(list)))}输出如下:$ go run charlist.go&nbsp;0: foo1: bar2: baz
随时随地看视频慕课网APP

相关分类

Go
我要回答