56 lines
1.6 KiB
JavaScript
56 lines
1.6 KiB
JavaScript
const Polynomial = require('./polynomial')
|
|
|
|
function ReedSolomonEncoder (degree) {
|
|
this.genPoly = undefined
|
|
this.degree = degree
|
|
|
|
if (this.degree) this.initialize(this.degree)
|
|
}
|
|
|
|
/**
|
|
* Initialize the encoder.
|
|
* The input param should correspond to the number of error correction codewords.
|
|
*
|
|
* @param {Number} degree
|
|
*/
|
|
ReedSolomonEncoder.prototype.initialize = function initialize (degree) {
|
|
// create an irreducible generator polynomial
|
|
this.degree = degree
|
|
this.genPoly = Polynomial.generateECPolynomial(this.degree)
|
|
}
|
|
|
|
/**
|
|
* Encodes a chunk of data
|
|
*
|
|
* @param {Uint8Array} data Buffer containing input data
|
|
* @return {Uint8Array} Buffer containing encoded data
|
|
*/
|
|
ReedSolomonEncoder.prototype.encode = function encode (data) {
|
|
if (!this.genPoly) {
|
|
throw new Error('Encoder not initialized')
|
|
}
|
|
|
|
// Calculate EC for this data block
|
|
// extends data size to data+genPoly size
|
|
const paddedData = new Uint8Array(data.length + this.degree)
|
|
paddedData.set(data)
|
|
|
|
// The error correction codewords are the remainder after dividing the data codewords
|
|
// by a generator polynomial
|
|
const remainder = Polynomial.mod(paddedData, this.genPoly)
|
|
|
|
// return EC data blocks (last n byte, where n is the degree of genPoly)
|
|
// If coefficients number in remainder are less than genPoly degree,
|
|
// pad with 0s to the left to reach the needed number of coefficients
|
|
const start = this.degree - remainder.length
|
|
if (start > 0) {
|
|
const buff = new Uint8Array(this.degree)
|
|
buff.set(remainder, start)
|
|
|
|
return buff
|
|
}
|
|
|
|
return remainder
|
|
}
|
|
|
|
module.exports = ReedSolomonEncoder
|