forked from cerc-io/plugeth
65 lines
1.2 KiB
Go
65 lines
1.2 KiB
Go
|
package ethutil
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"encoding/binary"
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
func NumberToBytes(num interface{}, bits int) []byte {
|
||
|
buf := new(bytes.Buffer)
|
||
|
err := binary.Write(buf, binary.BigEndian, num)
|
||
|
if err != nil {
|
||
|
fmt.Println("NumberToBytes failed:", err)
|
||
|
}
|
||
|
|
||
|
return buf.Bytes()[buf.Len()-(bits/8):]
|
||
|
}
|
||
|
|
||
|
func BytesToNumber(b []byte) uint64 {
|
||
|
var number uint64
|
||
|
|
||
|
// Make sure the buffer is 64bits
|
||
|
data := make([]byte, 8)
|
||
|
data = append(data[:len(b)], b...)
|
||
|
|
||
|
buf := bytes.NewReader(data)
|
||
|
err := binary.Read(buf, binary.BigEndian, &number)
|
||
|
if err != nil {
|
||
|
fmt.Println("BytesToNumber failed:", err)
|
||
|
}
|
||
|
|
||
|
return number
|
||
|
}
|
||
|
|
||
|
// Read variable integer in big endian
|
||
|
func ReadVarint(reader *bytes.Reader) (ret uint64) {
|
||
|
if reader.Len() == 8 {
|
||
|
var num uint64
|
||
|
binary.Read(reader, binary.BigEndian, &num)
|
||
|
ret = uint64(num)
|
||
|
} else if reader.Len() == 4 {
|
||
|
var num uint32
|
||
|
binary.Read(reader, binary.BigEndian, &num)
|
||
|
ret = uint64(num)
|
||
|
} else if reader.Len() == 2 {
|
||
|
var num uint16
|
||
|
binary.Read(reader, binary.BigEndian, &num)
|
||
|
ret = uint64(num)
|
||
|
} else {
|
||
|
var num uint8
|
||
|
binary.Read(reader, binary.BigEndian, &num)
|
||
|
ret = uint64(num)
|
||
|
}
|
||
|
|
||
|
return ret
|
||
|
}
|
||
|
|
||
|
func BinaryLength(num int) int {
|
||
|
if num == 0 {
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
return 1 + BinaryLength(num>>8)
|
||
|
}
|