web-dev-qa-db-ja.com

整数をバイト配列に変換します

私は[]byteを受け取る関数を持っていますが、私が持っているのはintです。この変換を行う最良の方法は何ですか?

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

私は長い道のりを経て文字列に入れてバイトに入れることができると思いますが、それはsoundsいように聞こえ、それを行うためのより良い方法があると思います。

40
vascop

私はBrainstormのアプローチに同意します。マシンフレンドリーなバイナリ表現を渡すと仮定すると、_encoding/binary_ライブラリを使用します。 OPは、binary.Write()にオーバーヘッドがある可能性があることを示唆しています。 Write()の実装について ソース を見ると、最大限の柔軟性を得るためにランタイムの決定を行うことがわかります。

_   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)
}
_
47
dyoo

"encoding/binary" パッケージを確認してください。特に Read および Write 関数:

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

申し訳ありませんが、これは少し遅れる可能性があります。しかし、私は行くドキュメントでより良い実装を見つけたと思います。

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