2013-06-02 8 views
26

私は[]byteを受け取る関数を持っていますが、私が持っているものはintです。この変換についてはどのような方法がありますか?整数をバイト配列に変換する

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

私は長い道を行くと、文字列にそれを取得し、バイトにそれを置くことができると思いますが、それは醜い聞こえると、私はそれを行うには良い方法があると思います。

答えて

27

私はブレインストームのアプローチに同意する:あなたは、マシンに優しいバイナリ表現を渡していると仮定して、encoding/binaryライブラリを使用しています。 OPは、binary.Write()にある程度のオーバーヘッドがあるかもしれないことを示唆している。 Write()を実装するためにthe sourceを見ると、柔軟性を最大限に高めるために実行時の決定を行うことがわかります。

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

右か? Write()は、非常に一般的なdata第3引数を取ります。これは、Goランタイムが強制的に型情報をエンコードする際にオーバーヘッドがかかるためです。 Write()は、状況に応じて必要としない実行時の決定を行っているため、エンコード関数を直接呼び出すだけで、パフォーマンスが向上するかどうかを確認できます。このような

何か:

package main 

import (
    "encoding/binary" 
    "fmt" 
) 

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

私たちは、これがどのように実行するかを知ってみましょう。

整数のASCII表現を取得しようとしている場合は、文字列表現(おそらくstrconv.Itoa)を取得し、その文字列を[]byte型にキャストできます。

package main 

import (
    "fmt" 
    "strconv" 
) 

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

あなたの最初の提案の小さなバリエーションを使用して終了しました。実装に自分自身をダイブする必要があります、チップのおかげで。 – vascop

20

「エンコード/バイナリ」パッケージを確認してください。特に読むとは、関数を書く:

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

が、それはint型よりも約4倍の時間がかかります - >列 - >バイト – vascop

+3

しかし、あなたの消費者が整数の何バイト表現を期待していますか?確かにASCII表現ではない?どうか明らかにしてください。 – dyoo

+0

@vascopです。しかし、 'binary.LittleEndian.PutUint64(bs、value)'はint - > string - > byteよりはるかに高速です。 –

8

申し訳ありませんが、これは少し遅れている可能性があります。しかし、私はgoドキュメント上でより良い実装を見つけたと思う。 「enconding /バイナリ」の道をベンチマーキングした後

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()) 
関連する問題