1 | function decode (buffer, maxLength, minimal) {
|
2 | maxLength = maxLength || 4
|
3 | minimal = minimal === undefined ? true : minimal
|
4 |
|
5 | var length = buffer.length
|
6 | if (length === 0) return 0
|
7 | if (length > maxLength) throw new TypeError('Script number overflow')
|
8 | if (minimal) {
|
9 | if ((buffer[length - 1] & 0x7f) === 0) {
|
10 | if (length <= 1 || (buffer[length - 2] & 0x80) === 0) throw new Error('Non-minimally encoded script number')
|
11 | }
|
12 | }
|
13 |
|
14 |
|
15 | if (length === 5) {
|
16 | var a = buffer.readUInt32LE(0)
|
17 | var b = buffer.readUInt8(4)
|
18 |
|
19 | if (b & 0x80) return -((b & ~0x80) * 0x100000000 + a)
|
20 | return b * 0x100000000 + a
|
21 | }
|
22 |
|
23 | var result = 0
|
24 |
|
25 |
|
26 | for (var i = 0; i < length; ++i) {
|
27 | result |= buffer[i] << (8 * i)
|
28 | }
|
29 |
|
30 | if (buffer[length - 1] & 0x80) return -(result & ~(0x80 << (8 * (length - 1))))
|
31 | return result
|
32 | }
|
33 |
|
34 | function scriptNumSize (i) {
|
35 | return i > 0x7fffffff ? 5
|
36 | : i > 0x7fffff ? 4
|
37 | : i > 0x7fff ? 3
|
38 | : i > 0x7f ? 2
|
39 | : i > 0x00 ? 1
|
40 | : 0
|
41 | }
|
42 |
|
43 | function encode (number) {
|
44 | var value = Math.abs(number)
|
45 | var size = scriptNumSize(value)
|
46 | var buffer = new Buffer(size)
|
47 | var negative = number < 0
|
48 |
|
49 | for (var i = 0; i < size; ++i) {
|
50 | buffer.writeUInt8(value & 0xff, i)
|
51 | value >>= 8
|
52 | }
|
53 |
|
54 | if (buffer[size - 1] & 0x80) {
|
55 | buffer.writeUInt8(negative ? 0x80 : 0x00, size - 1)
|
56 | } else if (negative) {
|
57 | buffer[size - 1] |= 0x80
|
58 | }
|
59 |
|
60 | return buffer
|
61 | }
|
62 |
|
63 | module.exports = {
|
64 | decode: decode,
|
65 | encode: encode
|
66 | }
|