cgo:将`[]uchar`转换为`[]字节`
首先,cgo非常酷,谢谢:) 不过,我确实有一个问题,我有很多C结构只包含一个字节数组,我想将其中的数组用作cgo:将`[]uchar`转换为`[]字节`,go,cgo,Go,Cgo,首先,cgo非常酷,谢谢:) 不过,我确实有一个问题,我有很多C结构只包含一个字节数组,我想将其中的数组用作[]字节。即: typedef struct { unsigned char data[64]; } pubkey; 我希望能够做到: type SchnorrPublicKey struct { pubkey C.pubkey } func (key *SchnorrPublicKey) String() string { return hex.EncodeT
[]字节。即:
typedef struct {
unsigned char data[64];
} pubkey;
我希望能够做到:
type SchnorrPublicKey struct {
pubkey C.pubkey
}
func (key *SchnorrPublicKey) String() string {
return hex.EncodeToString(key.pubkey.data[:])
}
但我得到了以下错误:
/schnorr.go:39:43:无法将key.pubkey.data[:](type[]\u Ctype\u uchar)用作hex.EncodeToString参数中的类型[]字节
我可以通过执行以下操作来实现这一点:
返回十六进制编码字符串(C.GoBytes(不安全的.Pointer(&key.pubkey.data[0])、C.int(len(key.pubkey.data)))
但是感觉有点愚蠢,将一个已经过的go片转换成另一个go片只是为了将\Ctype\uchar
类型替换为byte
类型是非常复杂的,而且它们都是100%兼容的
有没有更好的方法可以做到这一点?有一个公开的功能提案可以在中实现这一点
同时,如果切片的大小有一个恒定的上限(在本例中,64
):
var cPtr=&key.pubkey.data[0]
常数上限=64
变量n=64
切片:=(*[上限]字节)(不安全的.指针(cPtr))[:n:n]
如果没有,请参阅中的函数。首先为什么要使用[]C.uchar
?\u Ctype\u uchar
在Go中没有多大用处,而切片在C中也没有多大用处。似乎不创建这样的混合类型会更容易。这是cgo在Go中自动生成C结构的结果。无符号字符数据[64]代码>数组在go中表示为[].\u Ctype\u uchar
我怀疑它是否在创建[].\u Ctype\u uchar
,否则您不需要[:]
切片符号GoBytes
是将数据复制到Go内存中的正确功能,或者:,这里也介绍了这一点: