2014-02-18 64 views

回答

1

根據二進制包文檔用於解釋字節序列的編碼是一個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

1

例如,

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 
1

從預期的結果,這聽起來像你想解碼一個小小的32位整數。 binary.Uvarint函數對於作業來說是錯誤的,因爲它解碼了規範Protocol Buffers使用的可變長度整數編碼。

相反,嘗試使用binary.LittleEndian.Uint32()

val := binary.LittleEndian.Uint32(slice) 
相關問題