Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
large-numbers.js94 linesDownload Raw Back to esm
1// Tar can encode large and negative numbers using a leading byte of
2// 0xff for negative, and 0x80 for positive.
3export const encode = (num, buf) => {
4    if (!Number.isSafeInteger(num)) {
5        // The number is so large that javascript cannot represent it with integer
6        // precision.
7        throw Error('cannot encode number outside of javascript safe integer range');
8    }
9    else if (num < 0) {
10        encodeNegative(num, buf);
11    }
12    else {
13        encodePositive(num, buf);
14    }
15    return buf;
16};
17const encodePositive = (num, buf) => {
18    buf[0] = 0x80;
19    for (var i = buf.length; i > 1; i--) {
20        buf[i - 1] = num & 0xff;
21        num = Math.floor(num / 0x100);
22    }
23};
24const encodeNegative = (num, buf) => {
25    buf[0] = 0xff;
26    var flipped = false;
27    num = num * -1;
28    for (var i = buf.length; i > 1; i--) {
29        var byte = num & 0xff;
30        num = Math.floor(num / 0x100);
31        if (flipped) {
32            buf[i - 1] = onesComp(byte);
33        }
34        else if (byte === 0) {
35            buf[i - 1] = 0;
36        }
37        else {
38            flipped = true;
39            buf[i - 1] = twosComp(byte);
40        }
41    }
42};
43export const parse = (buf) => {
44    const pre = buf[0];
45    const value = pre === 0x80 ? pos(buf.subarray(1, buf.length))
46        : pre === 0xff ? twos(buf)
47            : null;
48    if (value === null) {
49        throw Error('invalid base256 encoding');
50    }
51    if (!Number.isSafeInteger(value)) {
52        // The number is so large that javascript cannot represent it with integer
53        // precision.
54        throw Error('parsed number outside of javascript safe integer range');
55    }
56    return value;
57};
58const twos = (buf) => {
59    var len = buf.length;
60    var sum = 0;
61    var flipped = false;
62    for (var i = len - 1; i > -1; i--) {
63        var byte = Number(buf[i]);
64        var f;
65        if (flipped) {
66            f = onesComp(byte);
67        }
68        else if (byte === 0) {
69            f = byte;
70        }
71        else {
72            flipped = true;
73            f = twosComp(byte);
74        }
75        if (f !== 0) {
76            sum -= f * Math.pow(256, len - i - 1);
77        }
78    }
79    return sum;
80};
81const pos = (buf) => {
82    var len = buf.length;
83    var sum = 0;
84    for (var i = len - 1; i > -1; i--) {
85        var byte = Number(buf[i]);
86        if (byte !== 0) {
87            sum += byte * Math.pow(256, len - i - 1);
88        }
89    }
90    return sum;
91};
92const onesComp = (byte) => (0xff ^ byte) & 0xff;
93const twosComp = (byte) => ((0xff ^ byte) + 1) & 0xff;
94//# sourceMappingURL=large-numbers.js.map
codekingpro/portable-devtools · Team Ai