cnf-qrcode
Version:
generate qrcode,support svg base64 utf8
65 lines (54 loc) • 1.56 kB
JavaScript
import Buffer from '../utils/buffer';
import * as GF from './galois-field';
/**
* Multiplies two polynomials inside Galois Field
*
* @param {Buffer} p1 Polynomial
* @param {Buffer} p2 Polynomial
* @return {Buffer} Product of p1 and p2
*/
export function mul(p1, p2) {
const coeff = new Buffer(p1.length + p2.length - 1);
coeff.fill(0);
for (let i = 0; i < p1.length; i++) {
for (let j = 0; j < p2.length; j++) {
coeff[i + j] ^= GF.mul(p1[i], p2[j]);
}
}
return coeff;
}
/**
* Calculate the remainder of polynomials division
*
* @param {Buffer} divident Polynomial
* @param {Buffer} divisor Polynomial
* @return {Buffer} Remainder
*/
export function mod(divident, divisor) {
let result = new Buffer(divident);
while ((result.length - divisor.length) >= 0) {
const coeff = result[0];
for (let i = 0; i < divisor.length; i++) {
result[i] ^= GF.mul(divisor[i], coeff);
}
// remove all zeros from buffer head
let offset = 0;
while (offset < result.length && result[offset] === 0) offset++;
result = result.slice(offset);
}
return result;
}
/**
* Generate an irreducible generator polynomial of specified degree
* (used by Reed-Solomon encoder)
*
* @param {Number} degree Degree of the generator polynomial
* @return {Buffer} Buffer containing polynomial coefficients
*/
export function generateECPolynomial(degree) {
let poly = new Buffer([1]);
for (let i = 0; i < degree; i++) {
poly = mul(poly, [1, GF.exp(i)]);
}
return poly;
}