第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 binary.PutVarint(...) 時索引超出范圍

使用 binary.PutVarint(...) 時索引超出范圍

Go
慕村225694 2021-11-08 17:02:30
http://play.golang.org/p/RqScJVvpS7package mainimport (    "fmt"    "math/rand"    "encoding/binary")func main() {    buffer := []byte{0, 0, 0, 0, 0, 0, 0, 0}    num := rand.Int63()    count := binary.PutVarint(buffer, num)    fmt.Println(count)}前一段時間我有這個工作,num當時只是一個遞增uint64,我正在使用binary.PutUvarint但現(xiàn)在它是一個隨機的 int64 并且binary.PutVarint我收到一個錯誤:panic: runtime error: index out of rangegoroutine 1 [running]:encoding/binary.PutUvarint(0x1042bf58, 0x8, 0x8, 0x6ccb, 0xff9faa4, 0x9acb0442, 0x7fcfd52, 0x4d658221)    /usr/local/go/src/encoding/binary/varint.go:44 +0xc0encoding/binary.PutVarint(0x1042bf58, 0x8, 0x8, 0x6ccb, 0x7fcfd52, 0x4d658221, 0x14f9e0, 0x104000e0)    /usr/local/go/src/encoding/binary/varint.go:83 +0x60main.main()    /tmp/sandbox010341234/main.go:12 +0x100我錯過了什么?我會認為這是一個微不足道的改變......編輯:我只是嘗試擴展我的緩沖區(qū)數(shù)組。對于一些奇怪的原因,它的工作原理和我獲得count的10。怎么可能?int64是 64 位 = 8 字節(jié),對嗎?
查看完整描述

1 回答

?
MMMHUHU

TA貢獻1834條經(jīng)驗 獲得超8個贊

引用文檔encoding/binary:


varint 函數(shù)使用可變長度編碼對單個整數(shù)值進行編碼和解碼;較小的值需要較少的字節(jié)。有關(guān)規(guī)范,請參閱https://developers.google.com/protocol-buffers/docs/encoding。


所以這binary.PutVarint()不是固定的,而是可變長度的編碼。傳遞 時int64,大數(shù)需要 8 個字節(jié)以上,小數(shù)需要 8 個字節(jié)以下。由于您編碼的數(shù)字是一個隨機數(shù),因此即使在其最高字節(jié)中也會有隨機位。


看這個簡單的例子:


buffer := make([]byte, 100)

for num := int64(1); num < 1<<60; num <<= 4 {

    count := binary.PutVarint(buffer, num)

    fmt.Printf("Num=%d, bytes=%d\n", num, count)

}

輸出:


Num=1, bytes=1

Num=16, bytes=1

Num=256, bytes=2

Num=4096, bytes=2

Num=65536, bytes=3

Num=1048576, bytes=4

Num=16777216, bytes=4

Num=268435456, bytes=5

Num=4294967296, bytes=5

Num=68719476736, bytes=6

Num=1099511627776, bytes=6

Num=17592186044416, bytes=7

Num=281474976710656, bytes=8

Num=4503599627370496, bytes=8

Num=72057594037927936, bytes=9

可變長度編碼的本質(zhì)是小數(shù)字使用較少的字節(jié),但這只能在大數(shù)字可能使用超過 8 個字節(jié)的情況下才能實現(xiàn)(即大小為int64)。


具體編碼的詳細信息在鏈接頁面上。


一個非常簡單的例子是:一個字節(jié)是 8 位。使用輸出字節(jié)的 7 位作為“有用”位來編碼數(shù)據(jù)/數(shù)字。如果最高位為 1,則意味著需要更多字節(jié)。如果最高位為 0,我們就完成了。你可以看到,小的數(shù)字可以使用1個輸出字節(jié)編碼(如n=10),而我們使用1個額外位,每7位有用的數(shù)據(jù),因此,如果輸入的號碼使用所有64位,我們將結(jié)束與更多8 字節(jié)以上:需要 10 組來覆蓋 64 位,因此我們將需要 10 字節(jié)(9 組僅 9*7=63 位)。


查看完整回答
反對 回復(fù) 2021-11-08
  • 1 回答
  • 0 關(guān)注
  • 318 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號