2 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊
使用該Uvarint方法正確解碼無(wú)符號(hào)字節(jié) .. 這是byte默認(rèn)情況下的 a 。
字節(jié)以無(wú)符號(hào)形式存儲(chǔ)(因?yàn)槟J(rèn)情況下字節(jié)是無(wú)符號(hào)的 -uint8在大多數(shù)語(yǔ)言中它是..的別名)。
當(dāng)您解碼數(shù)字時(shí),您正在調(diào)用binary.Varint.. 解碼一個(gè)帶符號(hào)的數(shù)字。由于符號(hào)位,這會(huì)導(dǎo)致數(shù)字不正確。
使用binary.Uvarint.. 即解碼一個(gè)無(wú)符號(hào)數(shù),你會(huì)得到正確的結(jié)果:
val, n := binary.Uvarint(array) // val = 18, n = 1
擴(kuò)展示例:
讓我們看看你的數(shù)字 - 18。在二進(jìn)制中,它是這樣的:
00010010
該binary.Varint功能是以下:
func Varint(buf []byte) (int64, int) {
ux, n := Uvarint(buf) // ok to continue in presence of error
x := int64(ux >> 1)
if ux&1 != 0 {
x = ^x
}
return x, n
}
基本上,它首先會(huì)獲取您提供的內(nèi)容的無(wú)符號(hào)值:18。
然后它將所有字節(jié)移動(dòng) 1。這導(dǎo)致:
00001001
那是 的二進(jìn)制表示9。注意符號(hào)位仍然是 0 - 這意味著一個(gè)正數(shù)。然后,它通過(guò)將原始值 ( 18) 與進(jìn)行按位與運(yùn)算來(lái)檢查是否反轉(zhuǎn)結(jié)果1。這樣做是因?yàn)椋凇拔抑肋@個(gè)數(shù)字是有符號(hào)的”上下文中運(yùn)行 - 這就是該函數(shù)存在的原因:
00010010
00000001
--------
00000000
= 0
那時(shí),零確實(shí)等于零——因此該方法返回x——即 9。
讓我們?cè)囋?1
使用 1 作為輸入:
00000001
右移:
00000000
AND原始數(shù)字 (1)與 1:
00000001
00000001
--------
= 1
此時(shí),結(jié)果不等于零..所以結(jié)果反轉(zhuǎn):
11111111
這是-1(注意符號(hào)位現(xiàn)在是 1 .. 表示負(fù)數(shù))的有符號(hào)表示。
- 2 回答
- 0 關(guān)注
- 159 瀏覽
添加回答
舉報(bào)