go - array - Convierte un entero a una matriz de bytes
hex string to byte c# (4)
¿Qué hay de malo en convertirlo en una cadena?
[]byte(fmt.Sprintf("%d", myint))
Tengo una función que recibe un []byte
pero lo que tengo es un int
, ¿cuál es la mejor manera de realizar esta conversión?
err = a.Write([]byte(myInt))
Creo que podría recorrer el largo camino y ponerlo en una cadena y ponerlo en bytes, pero suena feo y creo que hay mejores formas de hacerlo.
Consulte el paquete "codificación / binario". Particularmente las funciones de lectura y escritura:
binary.Write(a, binary.LittleEndian, myInt)
Estoy de acuerdo con el enfoque de Brainstorm: suponiendo que está pasando una representación binaria amigable para la máquina, use la biblioteca de encoding/binary
. El OP sugiere que binary.Write()
podría tener algunos gastos generales. Al observar la fuente para la implementación de Write()
, veo que toma algunas decisiones de tiempo de ejecución para una flexibilidad máxima.
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
...
¿Derecha? Write () toma un tercer argumento de data
muy genérico, y eso impone cierta sobrecarga ya que el tiempo de ejecución de Go se fuerza a la información del tipo de codificación. Dado que Write()
está haciendo algunas decisiones de tiempo de ejecución aquí que simplemente no necesita en su situación, tal vez puede llamar directamente a las funciones de codificación y ver si funciona mejor.
Algo como esto:
package main
import (
"encoding/binary"
"fmt"
)
func main() {
bs := make([]byte, 4)
binary.LittleEndian.PutUint32(bs, 31415926)
fmt.Println(bs)
}
Háganos saber cómo funciona esto.
De lo contrario, si solo intenta obtener una representación ASCII del entero, puede obtener la representación de cadena (probablemente con strconv.Itoa
) y convertir esa cadena al tipo de []byte
.
package main
import (
"fmt"
"strconv"
)
func main() {
bs := []byte(strconv.Itoa(31415926))
fmt.Println(bs)
}
Lo siento, esto podría ser un poco tarde. Pero creo que encontré una mejor implementación en los documentos go.
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())