Files
2026-07-27 14:07:26 +08:00

80 lines
2.1 KiB
JavaScript

import { getShortBytes, getShortBytesValue } from "./util.js";
var DATA_DESCRIPTOR_FLAG = 1 << 3;
var ENCRYPTION_FLAG = 1 << 0;
var NUMBER_OF_SHANNON_FANO_TREES_FLAG = 1 << 2;
var SLIDING_DICTIONARY_SIZE_FLAG = 1 << 1;
var STRONG_ENCRYPTION_FLAG = 1 << 6;
var UFT8_NAMES_FLAG = 1 << 11;
export default class GeneralPurposeBit {
constructor() {
this.descriptor = false;
this.encryption = false;
this.utf8 = false;
this.numberOfShannonFanoTrees = 0;
this.strongEncryption = false;
this.slidingDictionarySize = 0;
return this;
}
encode() {
return getShortBytes(
(this.descriptor ? DATA_DESCRIPTOR_FLAG : 0) |
(this.utf8 ? UFT8_NAMES_FLAG : 0) |
(this.encryption ? ENCRYPTION_FLAG : 0) |
(this.strongEncryption ? STRONG_ENCRYPTION_FLAG : 0),
);
}
static parse(buf, offset) {
var flag = getShortBytesValue(buf, offset);
var gbp = new GeneralPurposeBit();
gbp.useDataDescriptor((flag & DATA_DESCRIPTOR_FLAG) !== 0);
gbp.useUTF8ForNames((flag & UFT8_NAMES_FLAG) !== 0);
gbp.useStrongEncryption((flag & STRONG_ENCRYPTION_FLAG) !== 0);
gbp.useEncryption((flag & ENCRYPTION_FLAG) !== 0);
gbp.setSlidingDictionarySize(
(flag & SLIDING_DICTIONARY_SIZE_FLAG) !== 0 ? 8192 : 4096,
);
gbp.setNumberOfShannonFanoTrees(
(flag & NUMBER_OF_SHANNON_FANO_TREES_FLAG) !== 0 ? 3 : 2,
);
return gbp;
}
setNumberOfShannonFanoTrees(n) {
this.numberOfShannonFanoTrees = n;
}
getNumberOfShannonFanoTrees() {
return this.numberOfShannonFanoTrees;
}
setSlidingDictionarySize(n) {
this.slidingDictionarySize = n;
}
getSlidingDictionarySize() {
return this.slidingDictionarySize;
}
useDataDescriptor(b) {
this.descriptor = b;
}
usesDataDescriptor() {
return this.descriptor;
}
useEncryption(b) {
this.encryption = b;
}
usesEncryption() {
return this.encryption;
}
useStrongEncryption(b) {
this.strongEncryption = b;
}
usesStrongEncryption() {
return this.strongEncryption;
}
useUTF8ForNames(b) {
this.utf8 = b;
}
usesUTF8ForNames() {
return this.utf8;
}
}