如何在go中将int64转换为字节数组?
我有一个id,它表示为如何在go中将int64转换为字节数组?,go,casting,Go,Casting,我有一个id,它表示为int64。如何将其转换为[]字节?我看到二进制软件包对UINT执行此操作,但我想确保不会中断负数。在int64和uint64之间转换不会改变符号位,只会改变符号位的解释方式 您可以将Uint64和PutUint64与正确的 输出: -123456789 [235 50 164 248 255 255 255 255] -123456789 守则: var num int64 = -123456789 // convert int64 to []byte buf :=
int64
。如何将其转换为[]字节
?我看到二进制软件包对UINT执行此操作,但我想确保不会中断负数。在int64
和uint64
之间转换不会改变符号位,只会改变符号位的解释方式
您可以将Uint64
和PutUint64
与正确的
输出:
-123456789
[235 50 164 248 255 255 255 255]
-123456789
守则:
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
您也可以使用此选项:
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
如果您不关心符号或尾数(例如,对映射的哈希键等原因),您可以简单地移位位,然后使用0b11111111(0xFF)将其和: (假设v是一个int32) (对于int64/uint64,您需要一个长度为8的字节片)在库中,您可以使用方法PutVariant([]字节,int64)从int64传输到字节,以及Variant([]字节)从字节传输到int64,而无需进一步强制转换。此代码在
您好,我是否应该使用常量
maxvarientlenxx
在put之前确定缓冲区的大小?否,PutUint64
使用固定长度编码。当使用PutVarint
时,您只需要maxVarinternxx
。b:=buf[:n]行的作用是什么?@JohnBalvinArias:这是因为本例使用可变长度编码
num is: [45 49 50 51 52 53 54 55 56 57], in string is: -123456789
b := [4]byte{
byte(0xff & v),
byte(0xff & (v >> 8)),
byte(0xff & (v >> 16)),
byte(0xff & (v >> 24))}
buf := make([]byte, 8)
var toBytes int64 = 900
fmt.Printf("toBytes:%d\n", toBytes)
binary.PutVarint(buf, toBytes)
fmt.Printf("buffer:%v\n", buf[:])
fromBytes, _ := binary.Varint(buf)
fmt.Printf("fromBytes:%d\n", fromBytes)