jsg*_*cke 9 bit-manipulation go
在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)
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*rth 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)
}
Run Code Online (Sandbox Code Playgroud)
使用起来几乎有点过分binary.BigEndian
,因为它的代码数量非常少,并且能够准确地看到正在发生的事情,从而获得了一些清晰度.但这是一个非常有争议的观点,所以你自己的品味和判断可能会有所不同.
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)
}
Run Code Online (Sandbox Code Playgroud)
我不确定是否惯用,但这是使用编码/二进制包的替代方法:
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)
}
Run Code Online (Sandbox Code Playgroud)
http://play.golang.org/p/MTyy5gIEp5