将[8] byte转换为uint64

全部。我遇到了一个看起来很奇怪的问题。(可能是我应该睡着了很久了,而我却忽略了一些明显的事情。)


[]byte由于进行了十六进制解码,我的长度为8。我需要产生一个uint64才能使用它。我尝试使用binary.Uvarint()fromencoding/binary来做,但是似乎只使用数组中的第一个字节。考虑以下示例。


package main


import (

    "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。


我是在解释这个错误吗?如果是这样,我应该改用什么?


www说
浏览 400回答 3
3回答

呼唤远方

您正在使用一种功能进行解码,而该功能的用途并非您所需要的: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 mainimport (    "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 mainimport (    "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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go