let Polynomial = require('./polynomial.js'); const to_bytes_ascii = a => a.charCodeAt(0); const from_bytes_ascii = a => String.fromCharCode(a); const to_bin = a => { var result = ""; for (var i = 0; i < a.length; i++) { var bin = a[i].charCodeAt().toString(2); result += Array(8 - bin.length + 1).join("0") + bin; } return result; } const to_ascii = a => { a = a.join(''); return String.fromCharCode(parseInt(a, 2));; } const fcs = m => { bits = m.map(to_bin); //message in binary bits = bits.join('').split('').reverse(); //reverse binary decoded message let M = new Polynomial.Class(2, bits); let L = new Polynomial.Class(2, new Array(16).fill(1)); let X = new Polynomial.Class(2, [0, 1]); let X16 = Polynomial.power(X, 16); let G = new Polynomial.Class(2, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1]); //jako ze można to od razu wymnożyć let fcs = Polynomial.multiply(X16, M); fcs = Polynomial.add(fcs, Polynomial.multiply( Polynomial.power(X, m.length * 8), L ) ) fcs = Polynomial.divide(fcs, G); for (let i = 0; i < 16 - fcs.coefficients.length; i++) fcs.coefficients.push(0); fcs.coefficients.reverse(); return fcs.coefficients; } function encode(m) { m = m.split(''); let res = fcs(m); let f1 = []; let f2 = []; for (let i = 0; i < res.length; i++) { if (i < 8) { f1.push(res[i]); } else { f2.push(res[i]); } } f1 = to_ascii(f1); f2 = to_ascii(f2); m.push(f1); m.push(f2); return m; } exports.encode = encode;