【问题标题】:How to convert [1024]C.char to [1024]byte如何将 [1024]C.char 转换为 [1024]byte
【发布时间】:2015-02-16 09:51:15
【问题描述】:

如何转换这个C(数组)类型:

char my_buf[BUF_SIZE];

到这个 Go(数组)类型:

type buffer [C.BUF_SIZE]byte

?尝试进行接口转换会给我这个错误:

cannot convert (*_Cvar_my_buf) (type [1024]C.char) to type [1024]byte

【问题讨论】:

    标签: go cgo


    【解决方案1】:

    最简单和最安全的方法是将其复制到一个切片中,而不是专门复制到[1024]byte

    mySlice := C.GoBytes(unsafe.Pointer(&C.my_buff), C.BUFF_SIZE)
    

    要直接使用内存而不使用副本,您可以通过unsafe.Pointer“投射”它。

    mySlice := (*[1 << 30]byte)(unsafe.Pointer(&C.my_buf))[:int(C.BUFF_SIZE):int(C.BUFF_SIZE)]
    // or for an array if BUFF_SIZE is a constant
    myArray := *(*[C.BUFF_SIZE]byte)(unsafe.Pointer(&C.my_buf))
    

    【讨论】:

    • 我特别想要一个数组,而不是切片。原因之一是我确实想复制。另外,C.BUF_SIZE 是 一个常量,所以我可以在 typedef 中使用它。还有,为什么要把它转换成指向一个巨大数组的指针呢?
    • 这个巨大的数组只是为了让 go 编译器接受任何有效的大小,但实际上并没有分配(参见这里的一些其他示例 github.com/golang/go/wiki/cgo)。
    【解决方案2】:

    使用 C.my_buf 的内容创建一个 Go 切片:

    arr := C.GoBytes(unsafe.Pointer(&C.my_buf), C.BUF_SIZE)
    

    创建一个 Go 数组...

    var arr [C.BUF_SIZE]byte
    copy(arr[:], C.GoBytes(unsafe.Pointer(&C.my_buf), C.BUF_SIZE))
    

    【讨论】:

    • @JimB 第二个例子似乎对我有用。这是一个示例play.golang.org/p/O49FFSyHCG(本地测试)你得到什么错误?我在 Mac 上运行 go1.4。
    • 啊,我从来没有检查过 cgo 是否将DEFINE 视为常量。在这种情况下确实有效。
    • 仅供参考,第二个示例将数据复制了两次。
    • @JimB 第一个副本在哪里?我假设第二个是由实际的 copy 内置完成的。还有@tidwall,为什么要取C.by_buf[0]的地址?那不是和取C.my_buf的地址一样吗?
    • @AttilaO。 C.GoBytes 将数据复制到一个新切片中。
    猜你喜欢
    • 2014-09-20
    • 1970-01-01
    • 2014-08-31
    • 2013-12-28
    • 2021-03-24
    • 1970-01-01
    • 2020-05-06
    • 2012-08-15
    • 2012-09-18
    相关资源
    最近更新 更多