Fixed issue with var int reading.

Reading uneven byte slices were broken.
This commit is contained in:
obscuren 2014-07-29 23:33:18 +02:00
parent 6e94c024e4
commit 6fd2401cdf
2 changed files with 27 additions and 4 deletions

View File

@ -45,15 +45,15 @@ func BytesToNumber(b []byte) uint64 {
// //
// Read a variable length number in big endian byte order // Read a variable length number in big endian byte order
func ReadVarint(reader *bytes.Reader) (ret uint64) { func ReadVarint(reader *bytes.Reader) (ret uint64) {
if reader.Len() == 8 { if reader.Len() > 4 {
var num uint64 var num uint64
binary.Read(reader, binary.BigEndian, &num) binary.Read(reader, binary.BigEndian, &num)
ret = uint64(num) ret = uint64(num)
} else if reader.Len() == 4 { } else if reader.Len() > 2 {
var num uint32 var num uint32
binary.Read(reader, binary.BigEndian, &num) binary.Read(reader, binary.BigEndian, &num)
ret = uint64(num) ret = uint64(num)
} else if reader.Len() == 2 { } else if reader.Len() > 0 {
var num uint16 var num uint16
binary.Read(reader, binary.BigEndian, &num) binary.Read(reader, binary.BigEndian, &num)
ret = uint64(num) ret = uint64(num)
@ -66,6 +66,30 @@ func ReadVarint(reader *bytes.Reader) (ret uint64) {
return ret return ret
} }
func ReadVarInt(buff []byte) (ret uint64) {
switch l := len(buff); {
case l > 4:
d := LeftPadBytes(buff, 8)
binary.Read(bytes.NewReader(d), binary.BigEndian, &ret)
case l > 2:
var num uint32
d := LeftPadBytes(buff, 4)
binary.Read(bytes.NewReader(d), binary.BigEndian, &num)
ret = uint64(num)
case l > 1:
var num uint16
d := LeftPadBytes(buff, 2)
binary.Read(bytes.NewReader(d), binary.BigEndian, &num)
ret = uint64(num)
default:
var num uint8
binary.Read(bytes.NewReader(buff), binary.BigEndian, &num)
ret = uint64(num)
}
return
}
// Binary length // Binary length
// //
// Returns the true binary length of the given number // Returns the true binary length of the given number

View File

@ -67,7 +67,6 @@ func (val *Value) Uint() uint64 {
return uint64(Val) return uint64(Val)
} else if Val, ok := val.Val.([]byte); ok { } else if Val, ok := val.Val.([]byte); ok {
return new(big.Int).SetBytes(Val).Uint64() return new(big.Int).SetBytes(Val).Uint64()
//return ReadVarint(bytes.NewReader(Val))
} else if Val, ok := val.Val.(*big.Int); ok { } else if Val, ok := val.Val.(*big.Int); ok {
return Val.Uint64() return Val.Uint64()
} }