私は[]byte
を受け取る関数を持っていますが、私が持っているものはint
です。この変換についてはどのような方法がありますか?整数をバイト配列に変換する
err = a.Write([]byte(myInt))
私は長い道を行くと、文字列にそれを取得し、バイトにそれを置くことができると思いますが、それは醜い聞こえると、私はそれを行うには良い方法があると思います。
私は[]byte
を受け取る関数を持っていますが、私が持っているものはint
です。この変換についてはどのような方法がありますか?整数をバイト配列に変換する
err = a.Write([]byte(myInt))
私は長い道を行くと、文字列にそれを取得し、バイトにそれを置くことができると思いますが、それは醜い聞こえると、私はそれを行うには良い方法があると思います。
私はブレインストームのアプローチに同意する:あなたは、マシンに優しいバイナリ表現を渡していると仮定して、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)
}
「エンコード/バイナリ」パッケージを確認してください。特に読むとは、関数を書く:
binary.Write(a, binary.LittleEndian, myInt)
申し訳ありませんが、これは少し遅れている可能性があります。しかし、私は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())
あなたの最初の提案の小さなバリエーションを使用して終了しました。実装に自分自身をダイブする必要があります、チップのおかげで。 – vascop