cgo: преобразование `[] uchar` в` [] byte` - PullRequest
0 голосов
/ 23 марта 2020

Прежде всего, cgo довольно круто, спасибо за это:)

У меня есть вопрос, хотя, у меня есть много структур C, которые просто содержат байтовый массив и я хочу использовать массив в нем как []byte. ie:

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: cannot use key.pubkey.data[:] (type []_Ctype_uchar) as type []byte in argument to hex.EncodeToString Я могу заставить это работать, делая что-то например: return hex.EncodeToString(C.GoBytes(unsafe.Pointer(&key.pubkey.data[0]), C.int(len(key.pubkey.data))))

Но это выглядит довольно глупо, очень сложно преобразовать уже go срез в другой go срез, просто чтобы заменить тип _Ctype_uchar типом byte, и в любом случае они на 100% совместимы.

Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 23 марта 2020

Существует открытое предложение для функции сделать это в https://golang.org/issue/19367.

Тем временем, если у вас есть постоянная верхняя граница для размера среза (как в данном случае 64):

    var cPtr = &key.pubkey.data[0]
    const upperBound = 64
    var n = 64

    slice := (*[upperBound]byte)(unsafe.Pointer(cPtr))[:n:n]

, а если нет, см. функцию в https://github.com/golang/go/issues/13656#issuecomment -303216308 .

...