为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
交互式爱情 2021-05-14 22:27:44
我想将go [] []字节转换为C ** char。换句话说,我有一个字节矩阵,我想在C中将其转换为char双指针。请假设我必须将[] []字节作为输入,并将** char作为输出。我知道可以通过执行以下操作将[] byte转换为* char:((*C.char)(unsafe.Pointer(&data[0])))但似乎不可能将这种情况扩展到第二维。我尝试了一些非常精细的操作,在其中将[] []字节打包到一个新的[] byte中。然后,我将该[]字节发送到C函数,该函数使用指针算术在正确的位置指向新的[]字节,从而创建一个** char。但是,这种转换给我带来了奇怪的行为,即我的数据经过几次迭代是正确的,但在两次函数调用之间似乎被破坏了。如果有人有任何想法,我将不胜感激。从响应中我看到,声明我正在使用原始数据而不是字符串也很重要。因此,go字节类型。因此,如果添加C字符串终止符,原始数据将被破坏。我只是使用C ** char,因为char的大小为一个字节。也就是说,感谢您的答复。我能够根据自己的需要调整接受的答案。
查看完整描述

2 回答

?
慕斯王

TA贡献1864条经验 获得超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)

{

    size_t i;


    for (i = 0; i < len; i++) {

        //printf("%ld: %s\n", i, list[i]);

    }

}

*/

import "C"

import "unsafe"


func main() {

    list := [][]byte{

        []byte("foo"),

        []byte("bar"),

        []byte("baz"),

    }


    test(list)

}


func test(list [][]byte) {

    // Determine the size of a pointer on the current system.

    var b *C.char

    ptrSize := unsafe.Sizeof(b)


    // Allocate the char** list.

    ptr := C.malloc(C.size_t(len(list)) * C.size_t(ptrSize))

    defer C.free(ptr)


    // Assign each byte slice to its appropriate offset.

    for i := 0; i < len(list); i++ {

        element := (**C.char)(unsafe.Pointer(uintptr(ptr) + uintptr(i)*ptrSize))

        *element = (*C.char)(unsafe.Pointer(&list[i][0]))

    }


    // Call our C function.

    C.test((**C.char)(ptr), C.size_t(len(list)))

}

输出如下:


$ go run charlist.go 

0: foo

1: bar

2: baz


查看完整回答
反对 回复 2021-05-31
  • 2 回答
  • 0 关注
  • 692 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信