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)
}
- 3 回答
- 0 关注
- 399 浏览
添加回答
举报