UNPKG

1.49 kBJavaScriptView Raw
1function 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 // 40-bit
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 // 32-bit / 24-bit / 16-bit / 8-bit
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
34function 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
43function 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
63module.exports = {
64 decode: decode,
65 encode: encode
66}