forked from mirror/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.
52 lines
943 B
52 lines
943 B
package main
|
|
|
|
import (
|
|
_"fmt"
|
|
"bytes"
|
|
"math"
|
|
)
|
|
|
|
func EncodeSlice(slice []interface{}) []byte {
|
|
var buff bytes.Buffer
|
|
|
|
for _, val := range slice {
|
|
switch t := val.(type) {
|
|
case []interface{}, []string:
|
|
buff.Write(Encode(t))
|
|
}
|
|
}
|
|
|
|
return buff.Bytes()
|
|
}
|
|
|
|
func Encode(object interface{}) []byte {
|
|
var buff bytes.Buffer
|
|
|
|
switch t := object.(type) {
|
|
case string:
|
|
if len(t) < 56 {
|
|
buff.WriteString(string(len(t) + 64) + t)
|
|
} else {
|
|
|
|
}
|
|
case uint32, uint64:
|
|
var num uint64
|
|
if _num, ok := t.(uint64); ok {
|
|
num = _num
|
|
} else if _num, ok := t.(uint32); ok {
|
|
num = uint64(_num)
|
|
}
|
|
|
|
if num >= 0 && num < 24 {
|
|
buff.WriteString(string(num))
|
|
} else if num <= uint64(math.Pow(2, 256)) {
|
|
}
|
|
case []byte:
|
|
// Cast the byte slice to a string
|
|
buff.Write(Encode(string(t)))
|
|
case []interface{}:
|
|
buff.Write(EncodeSlice(t))
|
|
}
|
|
|
|
return buff.Bytes()
|
|
}
|
|
|