在Go中将[]字节切片编码为int64是否有更好或更惯用的方式?
package main
import "fmt"
func main() {
var mySlice = []byte{244, 244, 244, 244, 244, 244, 244, 244}
var data int64
for i := 0; i < 8; i++ {
data |= int64(mySlice[i] & byte(255)) << uint((8*8)-((i+1)*8))
}
fmt.Println(data)
}
答案 0 :(得分:13)
您可以使用encoding / binary的ByteOrder为16,32,64位类型执行此操作
package main
import "fmt"
import "encoding/binary"
func main() {
var mySlice = []byte{244, 244, 244, 244, 244, 244, 244, 244}
data := binary.BigEndian.Uint64(mySlice)
fmt.Println(data)
}
答案 1 :(得分:5)
使用binary.BigEndian
几乎有点过分,因为它的代码数量非常少,而且能够清楚地看到&#39;继续但这是一个备受争议的观点,所以你自己的品味和判断可能会有所不同。
func main() {
var mySlice = []byte{123, 244, 244, 244, 244, 244, 244, 244}
data := uint64(0)
for _, b := range mySlice {
data = (data << 8) | uint64(b)
}
fmt.Printf("%x\n", data)
}
答案 2 :(得分:1)
我不确定惯用语,但这是使用编码/二进制包的替代方法:
package main
import (
"bytes"
"encoding/binary"
"fmt"
)
func main() {
var mySlice = []byte{244, 244, 244, 244, 244, 244, 244, 244}
buf := bytes.NewReader(mySlice)
var data int64
err := binary.Read(buf, binary.LittleEndian, &data)
if err != nil {
fmt.Println("binary.Read failed:", err)
}
fmt.Println(data)
}