为了账号安全,请及时绑定邮箱和手机立即绑定

将[8] byte转换为uint64

将[8] byte转换为uint64

Go
www说 2021-05-12 13:13:18
全部。我遇到了一个看起来很奇怪的问题。(可能是我应该睡着了很久了,而我却忽略了一些明显的事情。)[]byte由于进行了十六进制解码,我的长度为8。我需要产生一个uint64才能使用它。我尝试使用binary.Uvarint()fromencoding/binary来做,但是似乎只使用数组中的第一个字节。考虑以下示例。package mainimport (    "encoding/binary"    "fmt")func main() {    array := []byte{0x00, 0x01, 0x08, 0x00, 0x08, 0x01, 0xab, 0x01}    num, _ := binary.Uvarint(array[0:8])    fmt.Printf("%v, %x\n", array, num)}它在play.golang.org上。运行该命令时,即使显示为numas 0,即使以十六进制显示也应为000108000801ab01。此外,如果从中捕获了第二个值binary.Uvarint(),则它是从缓冲区读取的字节数,据我所知,即使实际上是1,也应为8。我是在解释这个错误吗?如果是这样,我应该改用什么?
查看完整描述

3 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

您正在使用一种功能进行解码,而该功能的用途并非您所需要的:


Varint是一种使用一个或多个字节对整数进行编码的方法。绝对值较小的数字占用较少的字节数。有关规范,请参见 http://code.google.com/apis/protocolbuffers/docs/encoding.html。


它不是标准编码,而是一个非常具体的可变字节数编码。这就是为什么它在值小于0x080的第一个字节处停止。


正如Stephen所指出的,binary.BigEndian和binary.LittleEndian提供了直接解码的有用函数:


type ByteOrder interface {

    Uint16([]byte) uint16

    Uint32([]byte) uint32

    Uint64([]byte) uint64

    PutUint16([]byte, uint16)

    PutUint32([]byte, uint32)

    PutUint64([]byte, uint64)

    String() string

}

所以你可以用


package main


import (

    "encoding/binary"

    "fmt"

)


func main() {

    array := []byte{0x00, 0x01, 0x08, 0x00, 0x08, 0x01, 0xab, 0x01}

    num := binary.LittleEndian.Uint64(array)

    fmt.Printf("%v, %x", array, num)

}

或(如果您想检查错误而不是恐慌,请感谢jimt使用直接解决方案指出此问题):


package main


import (

    "encoding/binary"

    "bytes"

    "fmt"

)


func main() {

    array := []byte{0x00, 0x01, 0x08, 0x00, 0x08, 0x01, 0xab, 0x01}

    var num uint64

    err := binary.Read(bytes.NewBuffer(array[:]), binary.LittleEndian, &num)

    fmt.Printf("%v, %x", array, num)

}


查看完整回答
反对 回复 2021-05-24
  • 3 回答
  • 0 关注
  • 399 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信