mirror of https://github.com/ethereum/go-ethereum
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.2 KiB
64 lines
1.2 KiB
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)
|
|
}
|
|
|