diff --git a/03-rozwiazanie.js b/03-rozwiazanie.js new file mode 100644 index 0000000..148e7bc --- /dev/null +++ b/03-rozwiazanie.js @@ -0,0 +1,13 @@ +const crc = require("./crc.js"); +let message = process.argv[3]; +let flag = process.argv[2]; +switch (flag) { + case '-e': + console.log(crc.encode(message)); + break; + case '-d': + + break; + default: + throw "incorect flag" +} \ No newline at end of file diff --git a/crc.js b/crc.js new file mode 100644 index 0000000..ca3fa1e --- /dev/null +++ b/crc.js @@ -0,0 +1,64 @@ +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; \ No newline at end of file diff --git a/polynomial.js b/polynomial.js index 8f9fc44..b7aef67 100644 --- a/polynomial.js +++ b/polynomial.js @@ -2,7 +2,14 @@ class Polynomial { constructor(mod, coefArray) { this.mod = mod; this.degree = (coefArray.length - 1); - this.coefficients = coefArray; + + this.coefficients = Array.from(coefArray); //zeby nie przekazywać referencji + this.normalize(); + } + normalize() { + while (this.coefficients && this.coefficients[this.coefficients.length - 1] == 0) { + this.coefficients.pop(); + } } }