将C语言中的`char name[8]`转换为Go语言中的`[8]byte`。

huangapple go评论106阅读模式
英文:

C char name[8] to GoLang Name [8]byte

问题

我有一个填充C结构体的C函数:

typedef struct {
  char name[8];
}

我需要将数据复制到具有相同内容的Go语言结构体中:

type sData struct {
  Name [8]byte
}

该结构体具有多个大小的参数:4、12、32,因此最好有一个处理多个大小的函数。

谢谢

英文:

I've got a C function that fills a C struct:

typedef struct {
  char name[8];
}

I need to copy data into Go lang struct that has the same content:

type sData struct {
  Name [8]byte
}

The structure has parameters of multiple sizes: 4, 12, 32 so it would be nice to have a function that deals with more than just one size.

thanks

答案1

得分: 1

为了使这个更通用一些,你可以将 C 字符数组分解为 *C.char,然后使用 unsafe.Pointer 将其强制转换回数组。

func charToBytes(dest []byte, src *C.char) {
    n := len(dest)
    copy(dest, (*(*[1024]byte)(unsafe.Pointer(src)))[:n:n])
}

或者可能更简单一些的方式:

func charToBytes(src *C.char, sz int) []byte {
    dest := make([]byte, sz)
    copy(dest, (*(*[1024]byte)(unsafe.Pointer(src)))[:sz:sz])
    return dest
}
英文:

To make this a little more generic, you can decompose the C char array to a *C.char, then use unsafe.Pointer to cast it back to an array.

func charToBytes(dest []byte, src *C.char) {
	n := len(dest)
	copy(dest, (*(*[1024]byte)(unsafe.Pointer(src)))[:n:n])
}

Or maybe a little easier

func charToBytes(src *C.char, sz int) []byte {
    dest := make([]byte, sz)
    copy(dest, (*(*[1024]byte)(unsafe.Pointer(src)))[:sz:sz])
    return dest
}

huangapple
  • 本文由 发表于 2016年5月26日 04:04:39
  • 转载请务必保留本文链接:https://go.coder-hub.com/37446623.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定