1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- 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
|