我需要将int64的一部分转换为golang中的字节数组。 我可以为单个int64成功做到这一点
1 2 3 4 5 | var p int64 = -3984171602573983744 fmt.Println(p) cn := make([]byte, 8) binary.LittleEndian.PutUint64(cn, uint64(p)) fmt.Println(cn) |
如何为int64切片实现它?
更准确地说,我试图在一个写入数据库的库中调用一个函数,该函数将字节数组作为参数。 我有一片int64,我需要将其转换为字节数组,反之亦然。 这可能吗?
- 您可能需要遍历并逐个执行此操作
-
对于每个int64s循环,将其存储为
binary.LittleEndian.PutUint64(cn[x:], yourUint64) ,其中x变为0、8、16...。 您的cn应该足够大以容纳所有数据(它是8的倍数)。 当您想阅读时,进行反向x1 := binary.LittleEndian.Uint64(cn[n:n+8]) ,其中n 变为0、1、2。有关更简单的muxing-demuxing示例,请参见play.golang.org/p/YVQOAG8-Xlm。 - @Ravi将此作为答案。
- 非常感谢,这很成功:) play.golang.org/p/OdRakHIk1PP
- 将字节片转换为int片的可能副本
例如,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | package main import ( "bytes" "encoding/binary" "fmt" "math" ) func main() { w64 := []int64{math.MinInt64, -1, 0, 1, math.MaxInt64} fmt.Println(w64) // Write []int64 to database []byte wbuf := new(bytes.Buffer) err := binary.Write(wbuf, binary.LittleEndian, w64) if err != nil { fmt.Println("binary.Write failed:", err) } db := wbuf.Bytes() fmt.Printf("% x ", db) // Read database []byte to []int64 rbuf := bytes.NewBuffer(db) r64 := make([]int64, (len(db)+7)/8) err = binary.Read(rbuf, binary.LittleEndian, &r64) if err != nil { fmt.Println("binary.Read failed:", err) } fmt.Println(r64) } |
游乐场:https://play.golang.org/p/4OscSOGZE52
输出:
1 2 3 | [-9223372036854775808 -1 0 1 9223372036854775807] 00 00 00 00 00 00 00 80 ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 7f [-9223372036854775808 -1 0 1 9223372036854775807] |
对于每个int64的循环,将其存储为
有关更简单的muxing-demuxing示例,请参见https://play.golang.org/p/YVQOAG8-Xlm。