1
1
module sui_rlp ::utils {
2
- use std::vector::{Self };
3
- use std::string::{Self ,String };
4
- use std::bcs;
5
- public fun to_bytes_u32 (number: u32 ): vector <u8> {
6
- let mut bytes: vector <u8 > = vector ::empty ();
7
- let mut i:u8 =0 ;
8
- while (i < 4 ){
9
- let val =( (number>>(i * 8 ) & 0xFF ) as u8 ) ;
10
- vector ::push_back (&mut bytes,val);
11
- i=i+1 ;
12
- };
13
- bytes.reverse ();
14
- bytes
15
- }
2
+ use std::bcs;
3
+
16
4
17
5
// Convert bytes to u32
18
- public fun from_bytes_u32 (bytes: &vector <u8 >): u32 {let mut result = 0 ;
19
- let mut multiplier = 1 ;
20
- let length = vector ::length (bytes);
21
-
22
- let mut i = length;
23
- while (i > 0 ) {
24
- i = i - 1 ;
25
- //std::debug::print(vector::borrow(bytes, i));
26
- result = result + ((*vector ::borrow (bytes, i) as u32 ) * multiplier);
27
- //std::debug::print(&result);
28
-
29
- if (i > 0 ) {
30
- multiplier = multiplier * 256
31
- };
32
-
6
+ public fun from_bytes_u32 (bytes: &vector <u8 >): u32 {
7
+ let mut bytes= truncate_zeros (bytes);
8
+ bytes.reverse ();
9
+ let mut diff= 4 -bytes.length ();
10
+ while (diff > 0 ) {
11
+ bytes.push_back (0_u8 );
12
+ diff=diff-1 ;
33
13
};
34
- result
14
+ sui:: bcs :: peel_u32 (& mut sui:: bcs :: new (bytes))
35
15
}
36
16
37
- fun truncate_zeros (bytes: &vector <u8 >): vector <u8> {
38
- let mut i = 0 ;
39
- let mut started = false ;
40
- let mut result: vector <u8 > = vector ::empty ();
41
- while (i < vector ::length (bytes)) {
42
- let val = *vector ::borrow (bytes, i) as u8 ;
43
- if (val > 0 || started) {
44
- started = true ;
45
- vector ::push_back (&mut result, val);
46
- };
47
17
48
- i = i + 1 ;
18
+ // Convert bytes to u64
19
+ public fun from_bytes_u64 (bytes: &vector <u8 >): u64 {
20
+ let mut bytes= truncate_zeros (bytes);
21
+ bytes.reverse ();
22
+ let mut diff= 8 -bytes.length ();
23
+ while (diff > 0 ) {
24
+ bytes.push_back (0_u8 );
25
+ diff=diff-1 ;
49
26
};
27
+ sui::bcs ::peel_u64 (&mut sui::bcs ::new (bytes))
50
28
51
- result
52
29
}
53
30
54
- // Convert bytes to u64
55
- public fun from_bytes_u64 (bytes: &vector <u8 >): u64 {
56
- let bytes = truncate_zeros (bytes);
57
- let mut result = 0 ;
58
- let mut multiplier = 1 ;
59
- let length = vector ::length (&bytes);
60
-
61
- let mut i = length;
62
- while (i > 0 ) {
63
- i = i - 1 ;
64
- //std::debug::print(vector::borrow(bytes, i));
65
- result = result + ((*vector ::borrow (&bytes, i) as u64 ) * (multiplier));
66
- //std::debug::print(&result);
67
- if (i > 0 ) {
68
- multiplier = multiplier * 256
69
- };
70
-
31
+ // Convert bytes to u128
32
+ public fun from_bytes_u128 (bytes: &vector <u8 >): u128 {
33
+ let mut bytes= truncate_zeros (bytes);
34
+ bytes.reverse ();
35
+ let mut diff= 16 -bytes.length ();
36
+ while (diff > 0 ) {
37
+ bytes.push_back (0_u8 );
38
+ diff=diff-1 ;
71
39
};
72
- result
40
+ sui::bcs ::peel_u128 (&mut sui::bcs ::new (bytes))
41
+
73
42
}
74
43
75
44
public fun to_bytes_u128 (number:u128 ):vector <u8>{
76
- let mut right:u128 = 128 ;
77
- let mut i=1 ;
78
- while (i < 16 ){
79
- right=right << 8 ;
80
- i=i+1 ;
81
-
82
- };
83
- let mut bytes=bcs::to_bytes (&number);
84
- bytes.reverse ();
85
- if (number < right){
86
- truncate_zeros (&bytes)
87
- }else {
88
- let mut prefix = vector <u8 >[0 ];
89
- prefix.append (truncate_zeros (&bytes));
90
- prefix
91
- }
45
+ let bytes=bcs::to_bytes (&number);
46
+ to_signed_bytes (bytes)
92
47
}
93
48
49
+
94
50
public fun to_bytes_u64 (number:u64 ):vector <u8>{
95
- let mut right:u64 = 128 ;
96
- let mut i=1 ;
97
- while (i < 8 ){
98
- right=right << 8 ;
99
- i=i+1 ;
51
+ let bytes=bcs::to_bytes (&number);
52
+ to_signed_bytes (bytes)
53
+ }
100
54
101
- };
102
- let mut bytes=bcs::to_bytes (&number);
55
+ public fun to_bytes_u32 (number: u32 ): vector <u8> {
56
+ let bytes=bcs::to_bytes (&number);
57
+ to_signed_bytes (bytes)
58
+ }
59
+
60
+ fun to_signed_bytes (mut bytes:vector <u8 >):vector <u8>{
103
61
bytes.reverse ();
104
- if (number < right){
105
- truncate_zeros (&bytes)
62
+ let truncated=truncate_zeros (&bytes);
63
+ let first_byte=*truncated.borrow (0 );
64
+
65
+ if (first_byte >= 128 ) {
66
+ let mut prefix = vector <u8 >[0 ];
67
+ prefix.append (truncated);
68
+ prefix
69
+
106
70
}else {
107
- let mut prefix = vector <u8 >[0 ];
108
- prefix.append (truncate_zeros (&bytes));
109
- prefix
71
+ truncated
110
72
}
73
+
111
74
}
112
75
113
- // Convert bytes to u128
114
- public fun from_bytes_u128 (bytes: &vector <u8 >): u128 {
115
- let bytes = truncate_zeros (bytes);
116
- let mut result = 0 ;
117
- let mut multiplier = 1 ;
118
- let length = vector ::length (&bytes);
119
-
120
- let mut i = length;
121
- while (i > 0 ) {
122
- i = i - 1 ;
123
- //std::debug::print(vector::borrow(bytes, i));
124
- result = result + ((*vector ::borrow (&bytes, i) as u128 ) * multiplier);
125
- //std::debug::print(&result);
126
-
127
- if (i > 0 ) {
128
- multiplier = multiplier * 256
76
+ fun truncate_zeros (bytes: &vector <u8 >): vector <u8> {
77
+ let mut i = 0 ;
78
+ let mut started = false ;
79
+ let mut result: vector <u8 > = vector ::empty ();
80
+ while (i < vector ::length (bytes)) {
81
+ let val = *vector ::borrow (bytes, i) as u8 ;
82
+ if (val > 0 || started) {
83
+ started = true ;
84
+ vector ::push_back (&mut result, val);
129
85
};
130
-
86
+
87
+ i = i + 1 ;
131
88
};
89
+
132
90
result
133
91
}
134
92
93
+
94
+
135
95
/* end is exclusive in slice*/
136
- public fun slice_vector (vec: &vector <u8 >, start: u64 , length: u64 ): vector <u8> {
96
+ public fun slice_vector (vec: &vector <u8 >, start: u64 , length: u64 ): vector <u8> {
137
97
let mut result = vector ::empty <u8 >();
138
98
let mut i = 0 ;
139
99
while (i < length) {
140
100
let value = *vector ::borrow (vec, start + i);
141
101
vector ::push_back (&mut result, value);
142
102
i = i + 1 ;
143
103
};
144
- //std::debug::print(&result);
145
104
result
146
105
}
147
106
148
-
107
+
149
108
}
150
109
151
110
module sui_rlp ::utils_test {
152
111
use sui_rlp::utils::{Self };
153
- use std::vector::{Self };
154
- use std::debug;
155
- use sui::bcs::{Self };
156
112
157
113
158
- #[test]
114
+ #[test]
159
115
fun test_u32_conversion () {
160
116
let num= (122 as u32 );
161
117
let bytes= utils::to_bytes_u32 (num);
162
118
let converted=utils::from_bytes_u32 (&bytes);
163
119
assert !(num==converted,0x01 );
164
-
120
+
165
121
}
166
122
167
123
#[test]
@@ -172,7 +128,7 @@ module sui_rlp::utils_test {
172
128
std::debug ::print (&bytes);
173
129
std::debug ::print (&converted);
174
130
assert !(num==converted,0x01 );
175
-
131
+
176
132
}
177
133
178
134
#[test]
@@ -183,24 +139,21 @@ module sui_rlp::utils_test {
183
139
let converted=utils::from_bytes_u128 (&bytes);
184
140
std::debug ::print (&converted);
185
141
assert !(num==converted,0x01 );
186
-
142
+
187
143
}
188
144
189
145
#[test]
190
146
fun test_vector_slice () {
191
147
let data=create_vector (10 );
192
148
let slice= utils::slice_vector (&data,0 ,3 );
193
149
let expected= create_vector (3 );
194
- //debug::print(&expected);
195
- //debug::print(&slice);
196
- //debug::print(&data);
197
150
assert !(slice==expected,0x01 );
198
151
199
-
152
+
200
153
}
201
154
202
155
fun create_vector (n:u8 ):vector <u8>{
203
- let mut data=vector ::empty ();
156
+ let mut data=vector ::empty ();
204
157
let mut i=0 ;
205
158
while (i < n){
206
159
vector ::push_back (&mut data,i);
0 commit comments