12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- var BufferUtil = require('../utils/buffer')
- var Polynomial = require('./polynomial')
- var Buffer = require('buffer').Buffer
- 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 {Buffer} data Buffer containing input data
- * @return {Buffer} 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
- var pad = BufferUtil.alloc(this.degree)
- var paddedData = Buffer.concat([data, pad], data.length + this.degree)
- // The error correction codewords are the remainder after dividing the data codewords
- // by a generator polynomial
- var 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
- var start = this.degree - remainder.length
- if (start > 0) {
- var buff = BufferUtil.alloc(this.degree)
- remainder.copy(buff, start)
- return buff
- }
- return remainder
- }
- module.exports = ReedSolomonEncoder
|