conversion.gno
24.23 Kb · 754 lines
1// conversions contains methods for converting Uint instances to other types and vice versa.
2// This includes conversions to and from basic types such as uint64 and int32, as well as string representations
3// and byte slices. Additionally, it covers marshaling and unmarshaling for JSON and other text formats.
4package uint256
5
6import (
7 "encoding/binary"
8 "strconv"
9)
10
11// Uint64 returns the lower 64 bits of z as a uint64.
12//
13// Returns:
14// - value: the low 64 bits of z
15func (z *Uint) Uint64() uint64 {
16 return z[0]
17}
18
19// Int64 returns the lower 64 bits of z as an int64.
20//
21// Returns:
22// - value: the low 64 bits of z interpreted as int64
23func (z *Uint) Int64() int64 {
24 return int64(z.Uint64())
25}
26
27// Uint64WithOverflow returns the lower 64 bits of z and true if overflow occurred.
28//
29// Returns:
30// - value: the low 64 bits of z
31// - overflow: true when any upper 192 bits are non-zero
32func (z *Uint) Uint64WithOverflow() (uint64, bool) {
33 return z[0], (z[1] | z[2] | z[3]) != 0
34}
35
36// SetUint64 sets z to the value of x and returns z.
37//
38// Parameters:
39// - x: the uint64 value assigned to z
40//
41// Returns:
42// - result: z after setting it to x
43func (z *Uint) SetUint64(x uint64) *Uint {
44 z[3], z[2], z[1], z[0] = 0, 0, 0, x
45 return z
46}
47
48// IsUint64 reports whether z can be represented as a uint64.
49//
50// Returns:
51// - fits: true when z is representable in 64 bits
52func (z *Uint) IsUint64() bool {
53 return (z[1] | z[2] | z[3]) == 0
54}
55
56// Dec returns the decimal representation of z.
57//
58// Returns:
59// - decimal: the base-10 representation of z
60func (z *Uint) Dec() string {
61 if z.IsZero() {
62 return "0"
63 }
64 if z.IsUint64() {
65 return strconv.FormatUint(z.Uint64(), 10)
66 }
67
68 // The max uint64 value being 18446744073709551615, the largest
69 // power-of-ten below that is 10000000000000000000.
70 // When we do a DivMod using that number, the remainder that we
71 // get back is the lower part of the output.
72 //
73 // The ascii-output of remainder will never exceed 19 bytes (since it will be
74 // below 10000000000000000000).
75 //
76 // Algorithm example using 100 as divisor
77 //
78 // 12345 % 100 = 45 (rem)
79 // 12345 / 100 = 123 (quo)
80 // -> output '45', continue iterate on 123
81 var (
82 // out is 98 bytes long: 78 (max size of a string without leading zeroes,
83 // plus slack so we can copy 19 bytes every iteration).
84 // We init it with zeroes, because when strconv appends the ascii representations,
85 // it will omit leading zeroes.
86 out [98]byte
87 divisor Uint
88 y = *z // copy z to avoid modifying it
89 pos = len(out) // position to write to
90 buf [19]byte // buffer to write uint64:s to
91 bufSlice []byte = buf[:0] // slice for strconv.AppendUint
92 )
93
94 // Initialize out array with '0's
95 for i := range out {
96 out[i] = '0'
97 }
98
99 // Set divisor to 10^19
100 divisor.SetUint64(10000000000000000000)
101
102 for {
103 // Obtain Q and R for divisor
104 var quot Uint
105 rem := udivrem(quot[:], y[:], &divisor)
106 y = quot // Set Q for next loop
107 // Convert the R to ascii representation
108 bufSlice = strconv.AppendUint(bufSlice[:0], rem.Uint64(), 10)
109 // Copy in the ascii digits
110 copy(out[pos-len(bufSlice):], bufSlice)
111 if y.IsZero() {
112 break
113 }
114 // Move 19 digits left
115 pos -= 19
116 }
117 // skip leading zeroes by only using the 'used size' of bufSlice
118 return string(out[pos-len(bufSlice):])
119}
120
121// ToString returns the decimal string representation of z.
122// Returns an empty string if z is nil. This method doesn't exist in holiman's uint256.
123//
124// Returns:
125// - decimal: z in base 10, or an empty string when z is nil
126func (z *Uint) ToString() string {
127 if z == nil {
128 return ""
129 }
130
131 return z.Dec()
132}
133
134// SetBytes interprets buf as a big-endian unsigned integer and sets z to that value.
135// If buf is larger than 32 bytes, uses only the last 32 bytes. Returns z.
136//
137// Parameters:
138// - buf: the big-endian byte sequence; if longer than 32 bytes, only its final 32 bytes are used
139//
140// Returns:
141// - result: z after decoding the selected big-endian bytes
142func (z *Uint) SetBytes(buf []byte) *Uint {
143 switch l := len(buf); l {
144 case 0:
145 z.Clear()
146 case 1:
147 z.SetBytes1(buf)
148 case 2:
149 z.SetBytes2(buf)
150 case 3:
151 z.SetBytes3(buf)
152 case 4:
153 z.SetBytes4(buf)
154 case 5:
155 z.SetBytes5(buf)
156 case 6:
157 z.SetBytes6(buf)
158 case 7:
159 z.SetBytes7(buf)
160 case 8:
161 z.SetBytes8(buf)
162 case 9:
163 z.SetBytes9(buf)
164 case 10:
165 z.SetBytes10(buf)
166 case 11:
167 z.SetBytes11(buf)
168 case 12:
169 z.SetBytes12(buf)
170 case 13:
171 z.SetBytes13(buf)
172 case 14:
173 z.SetBytes14(buf)
174 case 15:
175 z.SetBytes15(buf)
176 case 16:
177 z.SetBytes16(buf)
178 case 17:
179 z.SetBytes17(buf)
180 case 18:
181 z.SetBytes18(buf)
182 case 19:
183 z.SetBytes19(buf)
184 case 20:
185 z.SetBytes20(buf)
186 case 21:
187 z.SetBytes21(buf)
188 case 22:
189 z.SetBytes22(buf)
190 case 23:
191 z.SetBytes23(buf)
192 case 24:
193 z.SetBytes24(buf)
194 case 25:
195 z.SetBytes25(buf)
196 case 26:
197 z.SetBytes26(buf)
198 case 27:
199 z.SetBytes27(buf)
200 case 28:
201 z.SetBytes28(buf)
202 case 29:
203 z.SetBytes29(buf)
204 case 30:
205 z.SetBytes30(buf)
206 case 31:
207 z.SetBytes31(buf)
208 default:
209 z.SetBytes32(buf[l-32:])
210 }
211 return z
212}
213
214// SetBytes1 sets z from a 1-byte big-endian slice and returns z.
215// Panics if input is shorter than 1 byte.
216//
217// Parameters:
218// - in: the first byte is decoded in big-endian order; it must be present
219//
220// Returns:
221// - result: z after decoding the first byte of in
222func (z *Uint) SetBytes1(in []byte) *Uint {
223 z[3], z[2], z[1] = 0, 0, 0
224 z[0] = uint64(in[0])
225 return z
226}
227
228// SetBytes2 sets z from a 2-byte big-endian slice and returns z.
229// Panics if input is shorter than 2 bytes.
230//
231// Parameters:
232// - in: the byte sequence whose first 2 bytes are decoded in big-endian order; it must contain at least 2 bytes
233//
234// Returns:
235// - result: z after decoding the first 2 bytes of in in big-endian order
236func (z *Uint) SetBytes2(in []byte) *Uint {
237 _ = in[1] // bounds check hint to compiler; see golang.org/issue/14808
238 z[3], z[2], z[1] = 0, 0, 0
239 z[0] = uint64(binary.BigEndian.Uint16(in[0:2]))
240 return z
241}
242
243// SetBytes3 sets z from a 3-byte big-endian slice and returns z.
244// Panics if input is shorter than 3 bytes.
245//
246// Parameters:
247// - in: the byte sequence whose first 3 bytes are decoded in big-endian order; it must contain at least 3 bytes
248//
249// Returns:
250// - result: z after decoding the first 3 bytes of in in big-endian order
251func (z *Uint) SetBytes3(in []byte) *Uint {
252 _ = in[2] // bounds check hint to compiler; see golang.org/issue/14808
253 z[3], z[2], z[1] = 0, 0, 0
254 z[0] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])<<16
255 return z
256}
257
258// SetBytes4 sets z from a 4-byte big-endian slice and returns z.
259// Panics if input is shorter than 4 bytes.
260//
261// Parameters:
262// - in: the byte sequence whose first 4 bytes are decoded in big-endian order; it must contain at least 4 bytes
263//
264// Returns:
265// - result: z after decoding the first 4 bytes of in in big-endian order
266func (z *Uint) SetBytes4(in []byte) *Uint {
267 _ = in[3] // bounds check hint to compiler; see golang.org/issue/14808
268 z[3], z[2], z[1] = 0, 0, 0
269 z[0] = uint64(binary.BigEndian.Uint32(in[0:4]))
270 return z
271}
272
273// SetBytes5 sets z from a 5-byte big-endian slice and returns z.
274// Panics if input is shorter than 5 bytes.
275//
276// Parameters:
277// - in: the byte sequence whose first 5 bytes are decoded in big-endian order; it must contain at least 5 bytes
278//
279// Returns:
280// - result: z after decoding the first 5 bytes of in in big-endian order
281func (z *Uint) SetBytes5(in []byte) *Uint {
282 _ = in[4] // bounds check hint to compiler; see golang.org/issue/14808
283 z[3], z[2], z[1] = 0, 0, 0
284 z[0] = bigEndianUint40(in[0:5])
285 return z
286}
287
288// SetBytes6 sets z from a 6-byte big-endian slice and returns z.
289// Panics if input is shorter than 6 bytes.
290//
291// Parameters:
292// - in: the byte sequence whose first 6 bytes are decoded in big-endian order; it must contain at least 6 bytes
293//
294// Returns:
295// - result: z after decoding the first 6 bytes of in in big-endian order
296func (z *Uint) SetBytes6(in []byte) *Uint {
297 _ = in[5] // bounds check hint to compiler; see golang.org/issue/14808
298 z[3], z[2], z[1] = 0, 0, 0
299 z[0] = bigEndianUint48(in[0:6])
300 return z
301}
302
303// SetBytes7 sets z from a 7-byte big-endian slice and returns z.
304// Panics if input is shorter than 7 bytes.
305//
306// Parameters:
307// - in: the byte sequence whose first 7 bytes are decoded in big-endian order; it must contain at least 7 bytes
308//
309// Returns:
310// - result: z after decoding the first 7 bytes of in in big-endian order
311func (z *Uint) SetBytes7(in []byte) *Uint {
312 _ = in[6] // bounds check hint to compiler; see golang.org/issue/14808
313 z[3], z[2], z[1] = 0, 0, 0
314 z[0] = bigEndianUint56(in[0:7])
315 return z
316}
317
318// SetBytes8 sets z from an 8-byte big-endian slice and returns z.
319// Panics if input is shorter than 8 bytes.
320//
321// Parameters:
322// - in: the byte sequence whose first 8 bytes are decoded in big-endian order; it must contain at least 8 bytes
323//
324// Returns:
325// - result: z after decoding the first 8 bytes of in in big-endian order
326func (z *Uint) SetBytes8(in []byte) *Uint {
327 _ = in[7] // bounds check hint to compiler; see golang.org/issue/14808
328 z[3], z[2], z[1] = 0, 0, 0
329 z[0] = binary.BigEndian.Uint64(in[0:8])
330 return z
331}
332
333// SetBytes9 sets z from a 9-byte big-endian slice and returns z.
334// Panics if input is shorter than 9 bytes.
335//
336// Parameters:
337// - in: the byte sequence whose first 9 bytes are decoded in big-endian order; it must contain at least 9 bytes
338//
339// Returns:
340// - result: z after decoding the first 9 bytes of in in big-endian order
341func (z *Uint) SetBytes9(in []byte) *Uint {
342 _ = in[8] // bounds check hint to compiler; see golang.org/issue/14808
343 z[3], z[2] = 0, 0
344 z[1] = uint64(in[0])
345 z[0] = binary.BigEndian.Uint64(in[1:9])
346 return z
347}
348
349// SetBytes10 sets z from a 10-byte big-endian slice and returns z.
350// Panics if input is shorter than 10 bytes.
351//
352// Parameters:
353// - in: the byte sequence whose first 10 bytes are decoded in big-endian order; it must contain at least 10 bytes
354//
355// Returns:
356// - result: z after decoding the first 10 bytes of in in big-endian order
357func (z *Uint) SetBytes10(in []byte) *Uint {
358 _ = in[9] // bounds check hint to compiler; see golang.org/issue/14808
359 z[3], z[2] = 0, 0
360 z[1] = uint64(binary.BigEndian.Uint16(in[0:2]))
361 z[0] = binary.BigEndian.Uint64(in[2:10])
362 return z
363}
364
365// SetBytes11 sets z from an 11-byte big-endian slice and returns z.
366// Panics if input is shorter than 11 bytes.
367//
368// Parameters:
369// - in: the byte sequence whose first 11 bytes are decoded in big-endian order; it must contain at least 11 bytes
370//
371// Returns:
372// - result: z after decoding the first 11 bytes of in in big-endian order
373func (z *Uint) SetBytes11(in []byte) *Uint {
374 _ = in[10] // bounds check hint to compiler; see golang.org/issue/14808
375 z[3], z[2] = 0, 0
376 z[1] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])<<16
377 z[0] = binary.BigEndian.Uint64(in[3:11])
378 return z
379}
380
381// SetBytes12 sets z from a 12-byte big-endian slice and returns z.
382// Panics if input is shorter than 12 bytes.
383//
384// Parameters:
385// - in: the byte sequence whose first 12 bytes are decoded in big-endian order; it must contain at least 12 bytes
386//
387// Returns:
388// - result: z after decoding the first 12 bytes of in in big-endian order
389func (z *Uint) SetBytes12(in []byte) *Uint {
390 _ = in[11] // bounds check hint to compiler; see golang.org/issue/14808
391 z[3], z[2] = 0, 0
392 z[1] = uint64(binary.BigEndian.Uint32(in[0:4]))
393 z[0] = binary.BigEndian.Uint64(in[4:12])
394 return z
395}
396
397// SetBytes13 sets z from a 13-byte big-endian slice and returns z.
398// Panics if input is shorter than 13 bytes.
399//
400// Parameters:
401// - in: the byte sequence whose first 13 bytes are decoded in big-endian order; it must contain at least 13 bytes
402//
403// Returns:
404// - result: z after decoding the first 13 bytes of in in big-endian order
405func (z *Uint) SetBytes13(in []byte) *Uint {
406 _ = in[12] // bounds check hint to compiler; see golang.org/issue/14808
407 z[3], z[2] = 0, 0
408 z[1] = bigEndianUint40(in[0:5])
409 z[0] = binary.BigEndian.Uint64(in[5:13])
410 return z
411}
412
413// SetBytes14 sets z from a 14-byte big-endian slice and returns z.
414// Panics if input is shorter than 14 bytes.
415//
416// Parameters:
417// - in: the byte sequence whose first 14 bytes are decoded in big-endian order; it must contain at least 14 bytes
418//
419// Returns:
420// - result: z after decoding the first 14 bytes of in in big-endian order
421func (z *Uint) SetBytes14(in []byte) *Uint {
422 _ = in[13] // bounds check hint to compiler; see golang.org/issue/14808
423 z[3], z[2] = 0, 0
424 z[1] = bigEndianUint48(in[0:6])
425 z[0] = binary.BigEndian.Uint64(in[6:14])
426 return z
427}
428
429// SetBytes15 sets z from a 15-byte big-endian slice and returns z.
430// Panics if input is shorter than 15 bytes.
431//
432// Parameters:
433// - in: the byte sequence whose first 15 bytes are decoded in big-endian order; it must contain at least 15 bytes
434//
435// Returns:
436// - result: z after decoding the first 15 bytes of in in big-endian order
437func (z *Uint) SetBytes15(in []byte) *Uint {
438 _ = in[14] // bounds check hint to compiler; see golang.org/issue/14808
439 z[3], z[2] = 0, 0
440 z[1] = bigEndianUint56(in[0:7])
441 z[0] = binary.BigEndian.Uint64(in[7:15])
442 return z
443}
444
445// SetBytes16 sets z from a 16-byte big-endian slice and returns z.
446// Panics if input is shorter than 16 bytes.
447//
448// Parameters:
449// - in: the byte sequence whose first 16 bytes are decoded in big-endian order; it must contain at least 16 bytes
450//
451// Returns:
452// - result: z after decoding the first 16 bytes of in in big-endian order
453func (z *Uint) SetBytes16(in []byte) *Uint {
454 _ = in[15] // bounds check hint to compiler; see golang.org/issue/14808
455 z[3], z[2] = 0, 0
456 z[1] = binary.BigEndian.Uint64(in[0:8])
457 z[0] = binary.BigEndian.Uint64(in[8:16])
458 return z
459}
460
461// SetBytes17 sets z from a 17-byte big-endian slice and returns z.
462// Panics if input is shorter than 17 bytes.
463//
464// Parameters:
465// - in: the byte sequence whose first 17 bytes are decoded in big-endian order; it must contain at least 17 bytes
466//
467// Returns:
468// - result: z after decoding the first 17 bytes of in in big-endian order
469func (z *Uint) SetBytes17(in []byte) *Uint {
470 _ = in[16] // bounds check hint to compiler; see golang.org/issue/14808
471 z[3] = 0
472 z[2] = uint64(in[0])
473 z[1] = binary.BigEndian.Uint64(in[1:9])
474 z[0] = binary.BigEndian.Uint64(in[9:17])
475 return z
476}
477
478// SetBytes18 sets z from an 18-byte big-endian slice and returns z.
479// Panics if input is shorter than 18 bytes.
480//
481// Parameters:
482// - in: the byte sequence whose first 18 bytes are decoded in big-endian order; it must contain at least 18 bytes
483//
484// Returns:
485// - result: z after decoding the first 18 bytes of in in big-endian order
486func (z *Uint) SetBytes18(in []byte) *Uint {
487 _ = in[17] // bounds check hint to compiler; see golang.org/issue/14808
488 z[3] = 0
489 z[2] = uint64(binary.BigEndian.Uint16(in[0:2]))
490 z[1] = binary.BigEndian.Uint64(in[2:10])
491 z[0] = binary.BigEndian.Uint64(in[10:18])
492 return z
493}
494
495// SetBytes19 sets z from a 19-byte big-endian slice and returns z.
496// Panics if input is shorter than 19 bytes.
497//
498// Parameters:
499// - in: the byte sequence whose first 19 bytes are decoded in big-endian order; it must contain at least 19 bytes
500//
501// Returns:
502// - result: z after decoding the first 19 bytes of in in big-endian order
503func (z *Uint) SetBytes19(in []byte) *Uint {
504 _ = in[18] // bounds check hint to compiler; see golang.org/issue/14808
505 z[3] = 0
506 z[2] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])<<16
507 z[1] = binary.BigEndian.Uint64(in[3:11])
508 z[0] = binary.BigEndian.Uint64(in[11:19])
509 return z
510}
511
512// SetBytes20 sets z from a 20-byte big-endian slice and returns z.
513// Panics if input is shorter than 20 bytes.
514//
515// Parameters:
516// - in: the byte sequence whose first 20 bytes are decoded in big-endian order; it must contain at least 20 bytes
517//
518// Returns:
519// - result: z after decoding the first 20 bytes of in in big-endian order
520func (z *Uint) SetBytes20(in []byte) *Uint {
521 _ = in[19] // bounds check hint to compiler; see golang.org/issue/14808
522 z[3] = 0
523 z[2] = uint64(binary.BigEndian.Uint32(in[0:4]))
524 z[1] = binary.BigEndian.Uint64(in[4:12])
525 z[0] = binary.BigEndian.Uint64(in[12:20])
526 return z
527}
528
529// SetBytes21 sets z from a 21-byte big-endian slice and returns z.
530// Panics if input is shorter than 21 bytes.
531//
532// Parameters:
533// - in: the byte sequence whose first 21 bytes are decoded in big-endian order; it must contain at least 21 bytes
534//
535// Returns:
536// - result: z after decoding the first 21 bytes of in in big-endian order
537func (z *Uint) SetBytes21(in []byte) *Uint {
538 _ = in[20] // bounds check hint to compiler; see golang.org/issue/14808
539 z[3] = 0
540 z[2] = bigEndianUint40(in[0:5])
541 z[1] = binary.BigEndian.Uint64(in[5:13])
542 z[0] = binary.BigEndian.Uint64(in[13:21])
543 return z
544}
545
546// SetBytes22 sets z from a 22-byte big-endian slice and returns z.
547// Panics if input is shorter than 22 bytes.
548//
549// Parameters:
550// - in: the byte sequence whose first 22 bytes are decoded in big-endian order; it must contain at least 22 bytes
551//
552// Returns:
553// - result: z after decoding the first 22 bytes of in in big-endian order
554func (z *Uint) SetBytes22(in []byte) *Uint {
555 _ = in[21] // bounds check hint to compiler; see golang.org/issue/14808
556 z[3] = 0
557 z[2] = bigEndianUint48(in[0:6])
558 z[1] = binary.BigEndian.Uint64(in[6:14])
559 z[0] = binary.BigEndian.Uint64(in[14:22])
560 return z
561}
562
563// SetBytes23 sets z from a 23-byte big-endian slice and returns z.
564// Panics if input is shorter than 23 bytes.
565//
566// Parameters:
567// - in: the byte sequence whose first 23 bytes are decoded in big-endian order; it must contain at least 23 bytes
568//
569// Returns:
570// - result: z after decoding the first 23 bytes of in in big-endian order
571func (z *Uint) SetBytes23(in []byte) *Uint {
572 _ = in[22] // bounds check hint to compiler; see golang.org/issue/14808
573 z[3] = 0
574 z[2] = bigEndianUint56(in[0:7])
575 z[1] = binary.BigEndian.Uint64(in[7:15])
576 z[0] = binary.BigEndian.Uint64(in[15:23])
577 return z
578}
579
580// SetBytes24 sets z from a 24-byte big-endian slice and returns z.
581// Panics if input is shorter than 24 bytes.
582//
583// Parameters:
584// - in: the byte sequence whose first 24 bytes are decoded in big-endian order; it must contain at least 24 bytes
585//
586// Returns:
587// - result: z after decoding the first 24 bytes of in in big-endian order
588func (z *Uint) SetBytes24(in []byte) *Uint {
589 _ = in[23] // bounds check hint to compiler; see golang.org/issue/14808
590 z[3] = 0
591 z[2] = binary.BigEndian.Uint64(in[0:8])
592 z[1] = binary.BigEndian.Uint64(in[8:16])
593 z[0] = binary.BigEndian.Uint64(in[16:24])
594 return z
595}
596
597// SetBytes25 sets z from a 25-byte big-endian slice and returns z.
598// Panics if input is shorter than 25 bytes.
599//
600// Parameters:
601// - in: the byte sequence whose first 25 bytes are decoded in big-endian order; it must contain at least 25 bytes
602//
603// Returns:
604// - result: z after decoding the first 25 bytes of in in big-endian order
605func (z *Uint) SetBytes25(in []byte) *Uint {
606 _ = in[24] // bounds check hint to compiler; see golang.org/issue/14808
607 z[3] = uint64(in[0])
608 z[2] = binary.BigEndian.Uint64(in[1:9])
609 z[1] = binary.BigEndian.Uint64(in[9:17])
610 z[0] = binary.BigEndian.Uint64(in[17:25])
611 return z
612}
613
614// SetBytes26 sets z from a 26-byte big-endian slice and returns z.
615// Panics if input is shorter than 26 bytes.
616//
617// Parameters:
618// - in: the byte sequence whose first 26 bytes are decoded in big-endian order; it must contain at least 26 bytes
619//
620// Returns:
621// - result: z after decoding the first 26 bytes of in in big-endian order
622func (z *Uint) SetBytes26(in []byte) *Uint {
623 _ = in[25] // bounds check hint to compiler; see golang.org/issue/14808
624 z[3] = uint64(binary.BigEndian.Uint16(in[0:2]))
625 z[2] = binary.BigEndian.Uint64(in[2:10])
626 z[1] = binary.BigEndian.Uint64(in[10:18])
627 z[0] = binary.BigEndian.Uint64(in[18:26])
628 return z
629}
630
631// SetBytes27 sets z from a 27-byte big-endian slice and returns z.
632// Panics if input is shorter than 27 bytes.
633//
634// Parameters:
635// - in: the byte sequence whose first 27 bytes are decoded in big-endian order; it must contain at least 27 bytes
636//
637// Returns:
638// - result: z after decoding the first 27 bytes of in in big-endian order
639func (z *Uint) SetBytes27(in []byte) *Uint {
640 _ = in[26] // bounds check hint to compiler; see golang.org/issue/14808
641 z[3] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])<<16
642 z[2] = binary.BigEndian.Uint64(in[3:11])
643 z[1] = binary.BigEndian.Uint64(in[11:19])
644 z[0] = binary.BigEndian.Uint64(in[19:27])
645 return z
646}
647
648// SetBytes28 sets z from a 28-byte big-endian slice and returns z.
649// Panics if input is shorter than 28 bytes.
650//
651// Parameters:
652// - in: the byte sequence whose first 28 bytes are decoded in big-endian order; it must contain at least 28 bytes
653//
654// Returns:
655// - result: z after decoding the first 28 bytes of in in big-endian order
656func (z *Uint) SetBytes28(in []byte) *Uint {
657 _ = in[27] // bounds check hint to compiler; see golang.org/issue/14808
658 z[3] = uint64(binary.BigEndian.Uint32(in[0:4]))
659 z[2] = binary.BigEndian.Uint64(in[4:12])
660 z[1] = binary.BigEndian.Uint64(in[12:20])
661 z[0] = binary.BigEndian.Uint64(in[20:28])
662 return z
663}
664
665// SetBytes29 sets z from a 29-byte big-endian slice and returns z.
666// Panics if input is shorter than 29 bytes.
667//
668// Parameters:
669// - in: the byte sequence whose first 29 bytes are decoded in big-endian order; it must contain at least 29 bytes
670//
671// Returns:
672// - result: z after decoding the first 29 bytes of in in big-endian order
673func (z *Uint) SetBytes29(in []byte) *Uint {
674 _ = in[28] // bounds check hint to compiler; see golang.org/issue/14808
675 z[3] = bigEndianUint40(in[0:5])
676 z[2] = binary.BigEndian.Uint64(in[5:13])
677 z[1] = binary.BigEndian.Uint64(in[13:21])
678 z[0] = binary.BigEndian.Uint64(in[21:29])
679 return z
680}
681
682// SetBytes30 sets z from a 30-byte big-endian slice and returns z.
683// Panics if input is shorter than 30 bytes.
684//
685// Parameters:
686// - in: the byte sequence whose first 30 bytes are decoded in big-endian order; it must contain at least 30 bytes
687//
688// Returns:
689// - result: z after decoding the first 30 bytes of in in big-endian order
690func (z *Uint) SetBytes30(in []byte) *Uint {
691 _ = in[29] // bounds check hint to compiler; see golang.org/issue/14808
692 z[3] = bigEndianUint48(in[0:6])
693 z[2] = binary.BigEndian.Uint64(in[6:14])
694 z[1] = binary.BigEndian.Uint64(in[14:22])
695 z[0] = binary.BigEndian.Uint64(in[22:30])
696 return z
697}
698
699// SetBytes31 sets z from a 31-byte big-endian slice and returns z.
700// Panics if input is shorter than 31 bytes.
701//
702// Parameters:
703// - in: the byte sequence whose first 31 bytes are decoded in big-endian order; it must contain at least 31 bytes
704//
705// Returns:
706// - result: z after decoding the first 31 bytes of in in big-endian order
707func (z *Uint) SetBytes31(in []byte) *Uint {
708 _ = in[30] // bounds check hint to compiler; see golang.org/issue/14808
709 z[3] = bigEndianUint56(in[0:7])
710 z[2] = binary.BigEndian.Uint64(in[7:15])
711 z[1] = binary.BigEndian.Uint64(in[15:23])
712 z[0] = binary.BigEndian.Uint64(in[23:31])
713 return z
714}
715
716// SetBytes32 sets z from a 32-byte big-endian slice and returns z.
717// Panics if input is shorter than 32 bytes.
718//
719// Parameters:
720// - in: the byte sequence whose first 32 bytes are decoded in big-endian order; it must contain at least 32 bytes
721//
722// Returns:
723// - result: z after decoding the first 32 bytes of in in big-endian order
724func (z *Uint) SetBytes32(in []byte) *Uint {
725 _ = in[31] // bounds check hint to compiler; see golang.org/issue/14808
726 z[3] = binary.BigEndian.Uint64(in[0:8])
727 z[2] = binary.BigEndian.Uint64(in[8:16])
728 z[1] = binary.BigEndian.Uint64(in[16:24])
729 z[0] = binary.BigEndian.Uint64(in[24:32])
730 return z
731}
732
733// Utility methods that are "missing" among the bigEndian.UintXX methods.
734
735// bigEndianUint40 returns the uint64 value represented by the 5 bytes in big-endian order.
736func bigEndianUint40(b []byte) uint64 {
737 _ = b[4] // bounds check hint to compiler; see golang.org/issue/14808
738 return uint64(b[4]) | uint64(b[3])<<8 | uint64(b[2])<<16 | uint64(b[1])<<24 |
739 uint64(b[0])<<32
740}
741
742// bigEndianUint56 returns the uint64 value represented by the 7 bytes in big-endian order.
743func bigEndianUint56(b []byte) uint64 {
744 _ = b[6] // bounds check hint to compiler; see golang.org/issue/14808
745 return uint64(b[6]) | uint64(b[5])<<8 | uint64(b[4])<<16 | uint64(b[3])<<24 |
746 uint64(b[2])<<32 | uint64(b[1])<<40 | uint64(b[0])<<48
747}
748
749// bigEndianUint48 returns the uint64 value represented by the 6 bytes in big-endian order.
750func bigEndianUint48(b []byte) uint64 {
751 _ = b[5] // bounds check hint to compiler; see golang.org/issue/14808
752 return uint64(b[5]) | uint64(b[4])<<8 | uint64(b[3])<<16 | uint64(b[2])<<24 |
753 uint64(b[1])<<32 | uint64(b[0])<<40
754}