it-swarm.com.de

Konvertiert eine Ganzzahl in ein Byte-Array

Ich habe eine Funktion, die ein []byte aber ich, was ich habe, ist ein int, was ist der beste Weg, um diese Konvertierung durchzuführen?

err = a.Write([]byte(myInt))

Ich schätze, ich könnte den langen Weg gehen und es in eine Zeichenkette packen und in Bytes schreiben, aber es klingt hässlich und ich denke, es gibt bessere Möglichkeiten, das zu tun.

40
vascop

Ich stimme dem Ansatz von Brainstorm zu: Unter der Annahme, dass Sie eine maschinenfreundliche Binärdarstellung übergeben, verwenden Sie die Bibliothek encoding/binary. Das OP schlägt vor, dass binary.Write() etwas Overhead haben könnte. Wenn ich mir die Quelle für die Implementierung von Write() anschaue, sehe ich, dass es einige Laufzeitentscheidungen für maximale Flexibilität vornimmt.

   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
   ...

Recht? Write () nimmt ein sehr allgemeines data drittes Argument auf, und das verursacht einen gewissen Overhead, da die Go-Laufzeit dann gezwungen ist, Typinformationen zu codieren. Da Write() hier einige Laufzeitentscheidungen trifft, die Sie in Ihrer Situation einfach nicht benötigen, können Sie die Codierungsfunktionen möglicherweise direkt aufrufen und prüfen, ob sie eine bessere Leistung erbringen.

Etwas wie das:

package main

import (
    "encoding/binary"
    "fmt"
)

func main() {
    bs := make([]byte, 4)
    binary.LittleEndian.PutUint32(bs, 31415926)
    fmt.Println(bs)
}

Lassen Sie uns wissen, wie dies funktioniert.

Andernfalls können Sie, wenn Sie nur versuchen, eine ASCII -Darstellung der Ganzzahl zu erhalten, die Zeichenfolgendarstellung abrufen (wahrscheinlich mit strconv.Itoa ) und diese Zeichenfolge umwandeln auf den Typ []byte.

package main

import (
    "fmt"
    "strconv"
)

func main() {
    bs := []byte(strconv.Itoa(31415926))
    fmt.Println(bs)
}
47
dyoo

Schauen Sie sich das Paket "encoding/binary" an. Insbesondere die Funktionen Lesen und Schreiben :

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

Entschuldigung, das könnte etwas spät sein. Aber ich denke, ich habe eine bessere Implementierung für unterwegs gefunden.

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