-
Notifications
You must be signed in to change notification settings - Fork 79
/
uint256.go
127 lines (105 loc) · 3.34 KB
/
uint256.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package util
import (
"bytes"
"encoding/hex"
"encoding/json"
"fmt"
"strings"
"github.com/nspcc-dev/neo-go/pkg/io"
)
// Uint256Size is the size of Uint256 in bytes.
const Uint256Size = 32
// Uint256 is a 32 byte long unsigned integer.
type Uint256 [Uint256Size]uint8
// Uint256DecodeStringLE attempts to decode the given string (in LE representation) into an Uint256.
func Uint256DecodeStringLE(s string) (u Uint256, err error) {
if len(s) != Uint256Size*2 {
return u, fmt.Errorf("expected string size of %d got %d", Uint256Size*2, len(s))
}
b, err := hex.DecodeString(s)
if err != nil {
return u, err
}
return Uint256DecodeBytesLE(b)
}
// Uint256DecodeStringBE attempts to decode the given string (in BE representation)
// into an Uint256.
func Uint256DecodeStringBE(s string) (u Uint256, err error) {
if len(s) != Uint256Size*2 {
return u, fmt.Errorf("expected string size of %d got %d", Uint256Size*2, len(s))
}
b, err := hex.DecodeString(s)
if err != nil {
return u, err
}
return Uint256DecodeBytesBE(b)
}
// Uint256DecodeBytesBE attempts to decode the given string (in BE representation) into an Uint256.
func Uint256DecodeBytesBE(b []byte) (u Uint256, err error) {
if len(b) != Uint256Size {
return u, fmt.Errorf("expected []byte of size %d got %d", Uint256Size, len(b))
}
copy(u[:], b)
return u, nil
}
// Uint256DecodeBytesLE attempts to decode the given string (in LE representation) into an Uint256.
func Uint256DecodeBytesLE(b []byte) (u Uint256, err error) {
b = ArrayReverse(b)
return Uint256DecodeBytesBE(b)
}
// BytesBE returns a byte slice representation of u.
func (u Uint256) BytesBE() []byte {
return u[:]
}
// Reverse reverses the Uint256 object
func (u Uint256) Reverse() Uint256 {
res, _ := Uint256DecodeBytesLE(u.BytesBE())
return res
}
// BytesLE return a little-endian byte representation of u.
func (u Uint256) BytesLE() []byte {
return ArrayReverse(u.BytesBE())
}
// Equals returns true if both Uint256 values are the same.
func (u Uint256) Equals(other Uint256) bool {
return u == other
}
// String implements the stringer interface.
func (u Uint256) String() string {
return u.StringBE()
}
// StringBE produces string representation of Uint256 with BE byte order.
func (u Uint256) StringBE() string {
return hex.EncodeToString(u.BytesBE())
}
// StringLE produces string representation of Uint256 with LE byte order.
func (u Uint256) StringLE() string {
return hex.EncodeToString(u.BytesLE())
}
// UnmarshalJSON implements the json unmarshaller interface.
func (u *Uint256) UnmarshalJSON(data []byte) (err error) {
var js string
if err = json.Unmarshal(data, &js); err != nil {
return err
}
js = strings.TrimPrefix(js, "0x")
*u, err = Uint256DecodeStringLE(js)
return err
}
// MarshalJSON implements the json marshaller interface.
func (u Uint256) MarshalJSON() ([]byte, error) {
return []byte(`"0x` + u.StringLE() + `"`), nil
}
// CompareTo compares two Uint256 with each other. Possible output: 1, -1, 0
// 1 implies u > other.
// -1 implies u < other.
// 0 implies u = other.
func (u Uint256) CompareTo(other Uint256) int { return bytes.Compare(u[:], other[:]) }
// EncodeBinary implements io.Serializable interface.
func (u *Uint256) EncodeBinary(w *io.BinWriter) {
w.WriteBytes(u[:])
}
// DecodeBinary implements io.Serializable interface.
func (u *Uint256) DecodeBinary(r *io.BinReader) {
r.ReadBytes(u[:])
}