Fixed issue with var int reading.
Reading uneven byte slices were broken.
This commit is contained in:
		| @@ -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 | ||||||
|   | |||||||
| @@ -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() | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user