Maison >développement back-end >Golang >Comment puis-je convertir en toute sécurité un tableau C `[1024]C.char` en un tableau Go `[1024]byte` ?

Comment puis-je convertir en toute sécurité un tableau C `[1024]C.char` en un tableau Go `[1024]byte` ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-06 07:22:11179parcourir

How Can I Safely Convert a C `[1024]C.char` Array to a Go `[1024]byte` Array?

Conversion d'un tableau de caractères C en tableau d'octets Go

Lorsque vous travaillez avec C et Go, il est parfois nécessaire d'effectuer une conversion entre les deux langages types de tableaux. Cette question explore la conversion d'un tableau C de type [1024]C.char en un type de tableau Go [1024]byte.

Impossible de convertir directement

Tentative pour effectuer une conversion d'interface entraîne une erreur :

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

Cela est dû au fait que les deux types de tableaux sont fondamentalement différents en mémoire représentation.

Solution : Copier dans une tranche

Une méthode sûre et simple pour convertir le tableau C consiste à copier son contenu dans une tranche Go. Ceci peut être réalisé en utilisant le code suivant :

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

Ici, C.GoBytes convertit le tableau C en une tranche Go d'octets, qui peut être affectée à la variable mySlice.

Conversion non sécurisée

Si un accès direct à la mémoire est requis, il est possible de "caster" le tableau C en un tableau d'octets Go en utilisant unsafe.Pointer. Cependant, il s'agit d'une opération dangereuse qui doit être utilisée avec prudence :

mySlice := unsafe.Slice((*byte)(unsafe.Pointer(&C.my_buf)), C.BUFF_SIZE)

Cela convertit le tableau C en une tranche d'octets. Si un type de tableau est nécessaire, la tranche peut être convertie :

myArray := ([C.BUFF_SIZE]byte)(mySlice)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn