J'ai une fonction qui reçoit un []byte
_ mais ce que j’ai est un int
, quel est le meilleur moyen de procéder à cette conversion?
err = a.Write([]byte(myInt))
Je suppose que je pourrais aller très loin et le mettre dans une chaîne et le mettre dans des octets, mais cela semble moche et je suppose qu'il y a de meilleures façons de le faire.
Je suis d'accord avec l'approche de Brainstorm: en supposant que vous passez une représentation binaire conviviale pour une machine, utilisez la bibliothèque encoding/binary
. Le PO suggère que binary.Write()
pourrait avoir une surcharge. En regardant la source pour l'implémentation de Write()
, je constate qu'il prend des décisions à l'exécution pour une flexibilité maximale.
189 func Write(w io.Writer, order ByteOrder, data interface{}) error {
190 // Fast path for basic types.
191 var b [8]byte
192 var bs []byte
193 switch v := data.(type) {
194 case *int8:
195 bs = b[:1]
196 b[0] = byte(*v)
197 case int8:
198 bs = b[:1]
199 b[0] = byte(v)
200 case *uint8:
201 bs = b[:1]
202 b[0] = *v
...
Droite? Write () prend un troisième argument très générique data
et impose un surcoût car l'exécution de Go est ensuite forcée à coder les informations de type. Puisque Write()
prend des décisions d'exécution dont vous n'avez tout simplement pas besoin dans votre situation, vous pouvez peut-être simplement appeler directement les fonctions d'encodage et voir si elles fonctionnent mieux.
Quelque chose comme ça:
package main
import (
"encoding/binary"
"fmt"
)
func main() {
bs := make([]byte, 4)
binary.LittleEndian.PutUint32(bs, 31415926)
fmt.Println(bs)
}
Dites-nous comment cela fonctionne.
Sinon, si vous essayez simplement d'obtenir une représentation de l'entier ASCII), vous pouvez obtenir la représentation sous forme de chaîne (probablement avec strconv.Itoa
) et jette cette chaîne dans le type []byte
.
package main
import (
"fmt"
"strconv"
)
func main() {
bs := []byte(strconv.Itoa(31415926))
fmt.Println(bs)
}
Découvrez le package "encoding/binary" . En particulier les fonctions Read et Write :
binary.Write(a, binary.LittleEndian, myInt)
Désolé, c'est peut-être un peu tard. Mais je pense avoir trouvé une meilleure mise en œuvre sur la documentation en déplacement.
buf := new(bytes.Buffer)
var num uint16 = 1234
err := binary.Write(buf, binary.LittleEndian, num)
if err != nil {
fmt.Println("binary.Write failed:", err)
}
fmt.Printf("% x", buf.Bytes())