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