1
0
forked from kalmar/DALGLI0
DALGLI0/crc.js
2018-07-01 14:26:14 +02:00

77 lines
2.0 KiB
JavaScript

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('');
a = parseInt(a, 2);
console.log(a)
//nie znalazłem innego sposobu w js na osiągniecie tego efektu..
if (a < 126) //ponieważ wieksze liczby nie należą do typowego Ascii
return String.fromCharCode(a);
else {
return "0x" + a.toString(16);
// return "\\x" + a.toString(16); //escape \ nie wiem czemu dobrze nie działą i i tak wypisuje \\
}
}
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;
function decode(m) {
}
exports.decode = decode;