import { BitstreamReader as br, BitstreamWriter as bw } from '@astronautlabs/bitstream'; export const revbyte = (n: number, len = 8) => { let acc = 0; let n2 = n; let len2 = len; while (len2) { // can't use bitshifts or binray ops or else becomes negative acc = (acc * 2) + (n2 & 1); n2 >>= 1; len2--; } return acc; }; export class BitstreamReader extends br { rtotal = 0; addBuffer(hidden: Buffer) { const inp = Buffer.from(hidden); for (let i = 0; i < inp.byteLength; ++i) inp[i] = revbyte(inp[i]); super.addBuffer(inp); } readSync(len: number) { const v = super.readSync(len); this.rtotal += len; return revbyte(v, len); } } export type Writable = { write: (chunk: Buffer) => void; }; export class BitstreamWriter extends bw { wtotal = 0; constructor(private w: Writable) { super({ write: (c) => { const inp = Buffer.from(c); for (let i = 0; i < inp.byteLength; ++i) inp[i] = revbyte(inp[i]); this.w.write(inp); } }); } write(length: number, value: number): void { this.wtotal += length; if (length) { //tconsole.log(length, value) value = revbyte(value, length); } super.write(length, value); } }