mirror of https://github.com/ethereum/go-ethereum
parent
b40013ac30
commit
d5d2efbaf3
@ -0,0 +1,52 @@ |
|||||||
|
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() |
||||||
|
} |
Loading…
Reference in new issue