У меня есть id, который представлен в int64
. Как я могу преобразовать это в []byte
? Я вижу, что бинарный пакет делает это для uint, но я хочу, чтобы я не разбивал отрицательные числа.
Как преобразовать int64 в массив байтов в go?
Ответ 1
Преобразование между int64
и uint64
не меняет знаковый бит, а только то, как оно интерпретируется.
Вы можете использовать uint64
и PutUint64
с правильным ByteOrder
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
Ответ 2
Если вас не волнует знак или порядковый номер (например, по таким причинам, как хеширование ключей для карт и т.д.), Вы можете просто сдвинуть биты, а затем AND с 0b11111111 (0xFF):
(предположим, что v - это int32)
b := [4]byte{
byte(0xff & v),
byte(0xff & (v >> 8)),
byte(0xff & (v >> 16)),
byte(0xff & (v >> 24))}
(для int64/uint64 вам понадобится фрагмент байта длиной 8)
Ответ 3
Код:
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
Ответ 4
Вы также можете использовать это:
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