在int中编码[]字节切片的更多惯用方法是什么?

时间:2014-01-01 19:09:14

标签: go bit-manipulation

在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)
}

http://play.golang.org/p/VjaqeFkgBX

3 个答案:

答案 0 :(得分:13)

您可以使用encoding / binary的ByteOrder为16,32,64位类型执行此操作

Play

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)
}

http://play.golang.org/p/MTyy5gIEp5