web-dev-qa-db-fra.com

Convertir un entier en tableau d'octets

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.

40
vascop

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)
}
47
dyoo

Découvrez le package "encoding/binary" . En particulier les fonctions Read et Write :

binary.Write(a, binary.LittleEndian, myInt)
25
Brainstorm

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())
10
Agniva De Sarker