【问题标题】:More idiomatic way in Go to encode a []byte slice int an int64?Go 中将 []byte 切片 int 编码为 int64 的更惯用方式?
【发布时间】:2014-01-19 06:21:30
【问题描述】:

在 Go 中有更好或更惯用的方法将 []byte 切片编码为 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

【问题讨论】:

    标签: go bit-manipulation


    【解决方案1】:

    您可以使用 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)
    }
    

    【讨论】:

    • 很有魅力。谢谢。
    • 不错。不知道这种方式。
    • 但是OP的代码产生一个负数,这产生一个正数:-S(即他要求int64,这是uint64)
    【解决方案2】:

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

    【讨论】:

    • 这行得通,只需将 uint64 更改为 int64 即可满足原始问题的具体情况。但除此之外, Println 和 Printf( "%x\n", data ) 返回相同的输出
    • 很好的解决方案。
    • 我找到的唯一解决方案是将 -3 `[]byte{255,253} 的字节数组转换为 int16,谢谢 :-D
    【解决方案3】:

    我不确定惯用语,但这里有一个使用 encoding/binary 包的替代方案:

    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

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 2016-12-09
      • 2021-01-16
      • 2012-10-19
      • 2013-04-07
      • 2022-10-13
      相关资源
      最近更新 更多