1 回答
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 位)。
- 1 回答
- 0 關(guān)注
- 318 瀏覽
添加回答
舉報
