ya-express-ntlm
Version:
84 lines (73 loc) • 1.89 kB
text/typescript
const binary2hex = {
'0000': 0,
'0001': 1,
'0010': 2,
'0011': 3,
'0100': 4,
'0101': 5,
'0110': 6,
'0111': 7,
1000: 8,
1001: 9,
1010: 'A',
1011: 'B',
1100: 'C',
1101: 'D',
1110: 'E',
1111: 'F',
} as const;
export function binaryArray2bytes (array: ReadonlyArray<0 | 1>): Buffer {
const bufArray: Buffer[] = [];
for (let i = 0; i < array.length; i += 8) {
if (i + 7 > array.length) break;
const binString1 = `${array[i]}${array[i + 1]}${array[i + 2]}${
array[i + 3]
}` as const;
const binString2 = `${array[i + 4]}${array[i + 5]}${array[i + 6]}${
array[i + 7]
}` as const;
const hexChar1 = binary2hex[binString1];
const hexChar2 = binary2hex[binString2];
const buf = Buffer.from(`${hexChar1}${hexChar2}`, 'hex');
bufArray.push(buf);
}
return Buffer.concat(bufArray);
}
const hex2binary = {
0: [0, 0, 0, 0],
1: [0, 0, 0, 1],
2: [0, 0, 1, 0],
3: [0, 0, 1, 1],
4: [0, 1, 0, 0],
5: [0, 1, 0, 1],
6: [0, 1, 1, 0],
7: [0, 1, 1, 1],
8: [1, 0, 0, 0],
9: [1, 0, 0, 1],
A: [1, 0, 1, 0],
B: [1, 0, 1, 1],
C: [1, 1, 0, 0],
D: [1, 1, 0, 1],
E: [1, 1, 1, 0],
F: [1, 1, 1, 1],
} as const;
export function bytes2binaryArray (buf: Buffer): Array<0 | 1> {
const hexString = buf.toString('hex').toUpperCase();
const array: Array<0 | 1> = [];
for (let i = 0; i < hexString.length; i++) {
const hexChar = hexString.charAt(i) as keyof typeof hex2binary;
array.push(...hex2binary[hexChar]);
}
return array;
}
export function insertZerosEvery7Bits (buf: Buffer): Buffer {
const binaryArray = bytes2binaryArray(buf);
const newBinaryArray: Array<0 | 1> = [];
for (let i = 0; i < binaryArray.length; i++) {
newBinaryArray.push(binaryArray[i]);
if ((i + 1) % 7 === 0) {
newBinaryArray.push(0);
}
}
return binaryArray2bytes(newBinaryArray);
}