aboutsummaryrefslogtreecommitdiffstats
path: root/ethutil/bytes.go
diff options
context:
space:
mode:
Diffstat (limited to 'ethutil/bytes.go')
-rw-r--r--ethutil/bytes.go30
1 files changed, 27 insertions, 3 deletions
diff --git a/ethutil/bytes.go b/ethutil/bytes.go
index 53b8cf645..eca2cc366 100644
--- a/ethutil/bytes.go
+++ b/ethutil/bytes.go
@@ -45,15 +45,15 @@ func BytesToNumber(b []byte) uint64 {
//
// Read a variable length number in big endian byte order
func ReadVarint(reader *bytes.Reader) (ret uint64) {
- if reader.Len() == 8 {
+ if reader.Len() > 4 {
var num uint64
binary.Read(reader, binary.BigEndian, &num)
ret = uint64(num)
- } else if reader.Len() == 4 {
+ } else if reader.Len() > 2 {
var num uint32
binary.Read(reader, binary.BigEndian, &num)
ret = uint64(num)
- } else if reader.Len() == 2 {
+ } else if reader.Len() > 0 {
var num uint16
binary.Read(reader, binary.BigEndian, &num)
ret = uint64(num)
@@ -66,6 +66,30 @@ func ReadVarint(reader *bytes.Reader) (ret uint64) {
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
//
// Returns the true binary length of the given number