web-dev-qa-db-ja.com

int64をgoでバイト配列に変換するにはどうすればよいですか?

int64で表されるIDがあります。これを[]byteに変換するにはどうすればよいですか?バイナリパッケージはuintに対してこれを行うことがわかりますが、負の数を壊さないようにしたいと思います。

23
Charles L.

int64uint64の間の変換は、符号ビットを変更せず、解釈方法のみを変更します。

正しい ByteOrderUint64PutUint64を使用できます

http://play.golang.org/p/wN3ZlB40wH

i := int64(-123456789)

fmt.Println(i)

b := make([]byte, 8)
binary.LittleEndian.PutUint64(b, uint64(i))

fmt.Println(b)

i = int64(binary.LittleEndian.Uint64(b))
fmt.Println(i)

出力:

-123456789
[235 50 164 248 255 255 255 255]
-123456789
49
JimB

符号やエンディアンを気にしない場合(たとえば、マップのキーをハッシュするなどの理由)、ビットを単純にシフトしてから、それらを0b11111111(0xFF)とANDすることができます。

(vはint32であると仮定)

b := [4]byte{
        byte(0xff & v),
        byte(0xff & (v >> 8)),
        byte(0xff & (v >> 16)),
        byte(0xff & (v >> 24))}

(int64/uint64の場合、長さ8のバイトスライスが必要です)

3
AhmetB - Google

コード:

var num int64 = -123456789

// convert int64 to []byte
buf := make([]byte, binary.MaxVarintLen64)
n := binary.PutVarint(buf, num)
b := buf[:n]

// convert []byte to int64
x, n := binary.Varint(b)
fmt.Printf("x is: %v, n is: %v\n", x, n)

出力

x is: -123456789, n is: 4
2
sgon00

これも使用できます。

var num int64 = -123456789

b := []byte(strconv.FormatInt(num, 10))

fmt.Printf("num is: %v, in string is: %s", b, string(b))

出力:

num is: [45 49 50 51 52 53 54 55 56 57], in string is: -123456789
1
Jonathan Hecl