全部的我遇到了一个似乎很奇怪的问题.(可能是我该睡觉的时候已经过go 很久了,我忽略了一些显而易见的事情.)

我有一个长度为8的[]byte,这是一些祸不单行解码的结果.我需要生产一台uint64才能使用它.我try 过使用binary.Uvarint(),从encoding/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)
}

100

运行时,它会将num显示为0,即使十六进制的值应该是000108000801ab01.此外,如果从binary.Uvarint()中捕捉到第二个值,则是从缓冲区读取的字节数,据我所知,应该是8,即使它实际上是1.

我是不是理解错了?如果是这样的话,我应该用什么来代替呢?

谢谢你们所有人.:)

推荐答案

您正在使用一个功能进行解码,而该功能的用途不是您需要的:

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

这不是标准的编码,而是一种非常具体、可变字节数的编码.这就是它在值小于0x080的第一个字节处停止的原因.

正如斯蒂芬所指出的,二进制.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)
}

Go相关问答推荐

Golang ==错误:OCI运行时创建失败:无法启动容器进程:exec:./" bin:stat./" bin:没有这样的文件或目录:未知

+在具有html/模板Golang的Base64中

如何在围棋中从多部分.Part中获取多部分.文件而不保存到磁盘?

显示GUI时后台处理功能

如何确定泛型类型在运行时是否可比较?

仅使用公共 api 对 alexedwards/scs 进行简单测试

使用Goldmark在golang中添加ChildNode会导致堆栈溢出

如何忽略打印达到最大深度限制 go colly

杜松子wine 和中间件

使用 Go Colly 抓取所有可能的标签并将它们放入一个变量中

从 eBPF LRU 哈希映射中错误驱逐的元素

如何在 Golang http.Request 对象中读取自定义 ajaxParams

Get 请求在 Thunder 客户端/Postman 中返回数据,但在 Golang 代码中给出空白数据

如何使用 Go 代理状态为 OK 的预检请求?

确保 Go 1.20 编译时的严格可比性?

如何使用 Go 获取 X11 中的窗口列表

NaN 是 golang 中的可比类型吗?

具有多个嵌入式 struct 的 Go MarshalJSON 行为

如何在测试中传递用户名和密码等参数

Go 赋值涉及到自定义类型的指针