3 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
您正在使用一種功能進(jìn)行解碼,而該功能的用途并非您所需要的:
Varint是一種使用一個(gè)或多個(gè)字節(jié)對(duì)整數(shù)進(jìn)行編碼的方法。絕對(duì)值較小的數(shù)字占用較少的字節(jié)數(shù)。有關(guān)規(guī)范,請(qǐng)參見 http://code.google.com/apis/protocolbuffers/docs/encoding.html。
它不是標(biāo)準(zhǔn)編碼,而是一個(gè)非常具體的可變字節(jié)數(shù)編碼。這就是為什么它在值小于0x080的第一個(gè)字節(jié)處停止。
正如Stephen所指出的,binary.BigEndian和binary.LittleEndian提供了直接解碼的有用函數(shù):
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)
}
或(如果您想檢查錯(cuò)誤而不是恐慌,請(qǐng)感謝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 關(guān)注
- 434 瀏覽
添加回答
舉報(bào)