You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					57 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					57 lines
				
				1.6 KiB
			| 
											11 months ago
										 | 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 |