You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.4 KiB
59 lines
1.4 KiB
2 years ago
|
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);
|
||
|
}
|
||
|
}
|