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

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)

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

Dav*_*rth 13

您可以使用encoding/binary的ByteOrder16,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)

  • 但是OP的代码产生一个负数,这产生一个正数:-S(即他要求int64,这是uint64) (2认同)

Pau*_*kin 5

使用起来几乎有点过分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)


Eve*_*man 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)
}
Run Code Online (Sandbox Code Playgroud)

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