-
Notifications
You must be signed in to change notification settings - Fork 1
/
decompress.ts
38 lines (35 loc) · 1.13 KB
/
decompress.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import { traversalToTree } from "./tree-utils/pack-tree";
import { extractBytes } from "./tree-utils/trie";
import { Unpacker } from "./binary-utils/Unpacker";
export function decompress(compressed: Uint8Array) {
const unpacker = new Unpacker(compressed);
const dataLength = unpacker.readInt32(); // dataLength
const tree = unpackTree(unpacker);
const { maxBitsLength, minBitsLength } = unpackMaxAndMinBitsInTable(unpacker);
const bytes = extractBytes(
unpacker,
tree,
dataLength,
maxBitsLength,
minBitsLength
);
return bytes.map((byte) => String.fromCharCode(byte)).join("");
}
export function unpackTree(unpacker: Unpacker) {
const treeLength = unpacker.readInt8();
const traversal: number[] = [];
for (let i = 0; i < treeLength; i++) {
const byte = unpacker.readInt8();
traversal.push(byte);
}
const tree = traversalToTree(traversal);
return tree;
}
function unpackMaxAndMinBitsInTable(unpacker: Unpacker): {
maxBitsLength: any;
minBitsLength: any;
} {
const maxBitsLength = unpacker.readInt8();
const minBitsLength = unpacker.readInt8();
return { maxBitsLength, minBitsLength };
}