2013-06-02 33 views
26

Mam funkcję, która odbiera []byte, ale mam to, co mam, to jest najlepszy sposób, aby przejść do tej konwersji?Konwertuj liczbę całkowitą na tablicę bajtów

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

Chyba mogę przejść długą drogę i dostać go na ciąg znaków i umieścić, że w bajtach, ale brzmi brzydka i myślę, że są lepsze sposoby, aby to zrobić.

Odpowiedz

27

zgadzam się z podejściem Brainstorm jest: zakładając, że jesteś przechodzącą maszynowego przyjazny reprezentację binarną, korzystania z biblioteki encoding/binary. OP sugeruje, że binary.Write() może mieć trochę narzut. Patrząc na the source dla realizacji Write(), widzę, że robi pewne decyzje dotyczące czasu wykonywania dla maksymalnej elastyczności.

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

Dobrze? Write() przyjmuje bardzo ogólny trzeci argument, a to powoduje narzucenie pewnych kosztów, ponieważ środowisko wykonawcze Go jest następnie wymuszane na informacji typu kodowania. Ponieważ Write() robi tutaj pewne decyzje dotyczące runtime, których po prostu nie potrzebujesz w swojej sytuacji, możesz po prostu bezpośrednio wywołać funkcje kodowania i sprawdzić, czy działa lepiej.

coś takiego:

package main 

import (
    "encoding/binary" 
    "fmt" 
) 

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

Daj nam znać jak to działa.

W przeciwnym razie, jeśli próbujesz uzyskać reprezentację ASCII liczby całkowitej, możesz uzyskać reprezentację ciągu (prawdopodobnie z strconv.Itoa) i przesłać ten ciąg do typu []byte.

package main 

import (
    "fmt" 
    "strconv" 
) 

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

Skończyło się na małej zmianie pierwszej sugestii. Powinienem był sam zagłębić się w realizację, dzięki za napiwek. – vascop

20

Sprawdź pakiet "kodowanie/binarny". Szczególnie odczytu i zapisu funkcje:

binary.Write(a, binary.LittleEndian, myInt) 
+3

Po analizy porównawczej „enconding/binarny” sposób, to ma prawie 4 razy dłużej niż int -> String -> bajt – vascop

+3

Ale co bajt reprezentacja ma swoją konsument oczekiwać dla liczb całkowitych? Na pewno nie reprezentacja ASCII? Proszę o wyjaśnienie. – dyoo

+0

@vascop to robi. Ale 'binary.LittleEndian.PutUint64 (bs, value)' jest znacznie szybszy niż int -> string -> byte. –

8

Przepraszamy, może być nieco za późno. Ale myślę, że znalazłem lepszą implementację w dokumentach 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()) 
Powiązane problemy