我有一個長度爲4片存儲這樣一個int值錯誤int值:binary.Uvarint得到了比預期
[159 124 0 0]
然後我試圖val, encodeBytes := binary.Uvarint(slice)
,卻得到了錯誤val
:
val = 15903, encodebytes = 2
正確的val
應該是31903
,它有什麼問題?
下面是代碼:
http://play.golang.org/p/kvhu4fNOag
我有一個長度爲4片存儲這樣一個int值錯誤int值:binary.Uvarint得到了比預期
[159 124 0 0]
然後我試圖val, encodeBytes := binary.Uvarint(slice)
,卻得到了錯誤val
:
val = 15903, encodebytes = 2
正確的val
應該是31903
,它有什麼問題?
下面是代碼:
http://play.golang.org/p/kvhu4fNOag
根據二進制包文檔用於解釋字節序列的編碼是一個available here。它指定字節被解釋爲:
每個字節的varint,除了最後一個字節,擁有最顯著 位(MSB)集 - 這表明有更多字節來。 每個字節的低7位用於存儲二進制補碼 7位組的組數, 組首位。
的二進制表示爲:
1001 1111 , 0111 1100 , 0000 0000, 0000 0000
第一字節的最顯著位(MSB)被設置成所述第二字節也被解釋。第二個字節MSB未設置,因此其餘字節將被忽略。
通過降低MSB的字節解釋位,我們得到:
111 1100 , 001 1111
concatenated:
0011 1110 0001 1111
轉換這回十進制我們:
001 1111 , 111 1100
這兩組被解釋爲在號碼前,然後逆轉得到:
1 + 2 +4 + 8 + 16 + 0 + 0 + 0 + 0 + 512 + 1024 + 2048 + 4096 + 8192 = 15903
由於詹姆斯和peterSO的帖子表明你可能會t代替使用binary.LittleEndian.Uint32
。
例如,
package main
import (
"encoding/binary"
"fmt"
)
func main() {
bytes := []byte{159, 124, 0, 0}
integer := int(binary.LittleEndian.Uint32(bytes))
fmt.Println(bytes, integer)
}
輸出:
[159 124 0 0] 31903
從預期的結果,這聽起來像你想解碼一個小小的32位整數。 binary.Uvarint
函數對於作業來說是錯誤的,因爲它解碼了規範Protocol Buffers使用的可變長度整數編碼。
相反,嘗試使用binary.LittleEndian.Uint32()
:
val := binary.LittleEndian.Uint32(slice)